0

我有多个存储数据的表。

DNS 表包含

tld(id) | 2ld(id) | 3ld(id) | IPAddress
101     | 33      | 3       | 203.11.1.19

(示例值)

我有dnstld

id(index) | value(char)
101       | 'com'

(示例值)

同样dns2ld, dns3ld

例如,dns2ld 包含 (33,'marriot'),dns3ld 包含 (3,'australia')。

我可以轻松地将这些表与内部连接连接起来

INNER JOIN dns2ld ON dns.2ld=dns2ld.id 
INNER JOIN dnstld ON dns.tld=dnstld.id 
INNER JOIN dns3ld ON dns.3ld=dns3ld.id 

但是我有另一个表,其中包含列入黑名单的域

id(uniq) | 3ld(char) | 2ld(char) | tld(char)

如何加入这 5 个表,以便列出与黑名单匹配的 DNS 表中的内容。注意黑名单中的 3ld 可能为 NULL,2ld 可能为 NULL,但 tld 不能为 null。

我可能有许多域在黑名单中,但不在 dns 表中,因此在 dns2ld、dns2ld 和 dns3ld 表中未识别。

4

2 回答 2

0

严格来说,您可能不需要Blacklist.id.

假设您想按层次结构列出事物(即,如果未指定第二级,则第三级也不能),我相信以下应该有效:

SELECT DNS.ipAddress, tld.value, 2ld.value, 3ld.value
FROM Blacklist bl
JOIN DNS 
  ON dns.tld = bl.tld
     AND ((dns.2ld IS NULL AND bl.2ld IS NULL)
          OR (dns.2ld = bl.2ld))
     AND ((dns.3ld IS NULL AND bl.3ld IS NULL)
          OR (dns.2ld IS NOT NULL AND dns.3ld = bl.3ld))
JOIN DnsTld tld
  ON tld.id = bl.tld
LEFT JOIN Dns2ld 2ld
       ON 2ld.id = bl.2ld
LEFT JOIN Dns3ld 3ld
       ON 3ld.id = bl.3ld

嗯,以后你是不是觉得不能这么用缩写了?

于 2013-01-19T00:11:18.490 回答
0

为了找到列入黑名单的 dns 表中的条目此查询应该有效:

SELECT DISTINCT dns.IPAddress, dns3ld.value, dns2ld.value, dnstld.value
FROM dns
INNER JOIN dnstld ON dnstld.id = dns.tld
INNER JOIN dns2ld ON dns2ld.id = dns.2ld
INNER JOIN dns3ld ON dns3ld.id = dns.3ld
INNER JOIN blacklist bl
ON bl.tld = dnstld.value
   AND (bl.2ld IS NULL
        OR b1.2ld = dns2ld.value
           AND (bl.3ld IS NULL
                OR bl.3ld = dns3ld.value))
于 2013-01-19T13:43:23.457 回答