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 テーブルには含まれていないため、dnstld、dns2ld、および dns3ld テーブルで識別されないドメインが多数ある可能性があります。

4

2 に答える 2

0

厳密に言えば、おそらく必要ありませんBlacklist.id

階層別に物事をリストしたいと仮定すると (つまり、2 番目のレベルが指定されていない場合、3 番目も指定できません)、次のように動作するはずです。

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 に答える