2012-10-26 19 views
2

我想知道是否有顯示一組匹配或不同數據的方式..喜歡,說我有三個表,匹配列

tbl_1- 
ip |isp |infection 
---------------------- 
1 |aaaa |malware 
2 |bbbb |malware 
3 |cccc |ddos 
3 |cccc |trojan 
4 |dddd |ddos 

tbl_2- 
ip |isp |infection 
---------------------- 
1 |aaaa |malware 
3 |cccc |ddos 
4 |dddd |trojan 
5 |eeee |trojan 
6 |ffff |other 

tbl_3- 
ip |isp |infection 
---------------------- 
1 |aaaa |ddos 
6 |ffff | 
2 |bbbb |other 

,並得到如下結果,

Result i need- 
ip |isp |infection 
---------------------- 
1 |aaaa |malware 
1 |aaaa |ddos 
2 |bbbb |malware 
2 |bbbb |other 
3 |cccc |ddos 
3 |cccc |trojan 
4 |dddd |ddos 
4 |dddd |trojan 
5 |eeee |trojan 
6 |ffff |other 
6 |ffff | 

的問題是我不知道該用什麼方法,對於這種情況,我用這個查詢full join

SELECT a. * , b. * , c. * 
FROM tbl_1 a 
LEFT OUTER JOIN tbl_2 b 
USING (ip, isp, infection) 
LEFT OUTER JOIN tbl_3 c 
USING (ip, isp, infection) 
UNION 
SELECT a. * , b. * , c. * 
FROM tbl_2 b 
LEFT OUTER JOIN tbl_1 a 
USING (ip, isp, infection) 
LEFT OUTER JOIN tbl_3 c 
USING (ip, isp, infection) 
UNION 
SELECT a. * , b. * , c. * 
FROM tbl_3 c 
LEFT OUTER JOIN tbl_1 a 
USING (ip, isp, infection) 
LEFT OUTER JOIN tbl_2 b 
USING (ip, isp, infection) 

但這給出結果以不同的方式,

Result i get- 
ip |isp |infection ip |isp |infection ip |isp |infection 
---------------------- ---------------------- ---------------------- 
1 |aaaa |malware 1 |aaaa |malware NULL|NULL |NULL 
NULL|NULL |NULL  NULL|NULL |NULL  1 |aaaa |ddos 
2 |bbbb |malware NULL|NULL |NULL  NULL|NULL |NULL 
NULL|NULL |NULL  NULL|NULL |NULL  2 |bbbb |other 
3 |cccc |ddos  3 |cccc |ddos  NULL|NULL |NULL 
3 |cccc |trojan  NULL|NULL |NULL  NULL|NULL |NULL 
4 |dddd |ddos  NULL|NULL |NULL  NULL|NULL |NULL 
NULL|NULL |NULL  4 |dddd |trojan  NULL|NULL |NULL 
NULL|NULL |NULL  5 |eeee |trojan  NULL|NULL |NULL  
NULL|NULL |NULL  6 |ffff |other  NULL|NULL |NULL  
NULL|NULL |NULL  NULL|NULL |NULL  6 |ffff | 

請幫我在這一個,我想顯示只有3列中的數據..

非常感謝你:)

回答

3

這是簡單的UNION

SELECT ip, isp, infection FROM tbl_1 
UNION 
SELECT ip, isp, infection FROM tbl_2 
UNION 
SELECT ip, isp, infection FROM tbl_3 
ORDER BY IP 

SQLFiddle Demo

+1

哦~~ ...:P感謝我指出了......我想一切都變得複雜,正錯過了這些解決方案,非常感謝:) –

+1

不客氣:D –

1
SELECT * 
FROM (
     SELECT * FROM tbl_1 
     UNION 
     SELECT * FROM tbl_2 
     UNION 
     SELECT * FROM tbl_3 
     ) AS t 
ORDER BY ip, isp 
+1

爲什麼一個簡單的UNION在所有3個表之間的內部查詢會給他他需要的結果? – 9ee1

+0

非常感謝您的回覆,一旦您將SELECT語句的別名添加爲SELECT * FROM(...)作爲ORDER BY BY IP,那麼這也適用。 isp' ...非常感謝你:) :)非常感謝 –

+0

@agarhy內部查詢在性能上沒有什麼區別,但是我覺得union的結尾處的ORDER BY子句使得intent更清晰 – nawfal

1

你應該UNION三個表,做GROUP BY,以便移除重複:

SELECT ip, isp, infection 
FROM tbl_1 

UNION 

SELECT ip, isp, infection 
FROM tbl_2 

UNION 

SELECT ip, isp, infection 
FROM tbl_3 

GROUP BY ip, isp, infection 

ORDER BY IP 
+0

非常感謝您的回覆:) –

+0

不客氣!刪除重複項! :-) – RGO

+0

yeaa再次肯定再次感謝:) –

1

這不是最優雅的解決方案,但會像這樣的工作? (假設我有語法正確的......目前無法測試吧):

SELECT * FROM ((SELECT * FROM tbl_1) UNION (SELECT * FROM tbl_2) UNION (SELECT * FROM tbl_3)) ORDER BY isp DESC, infection DESC; 
+0

是啊,你也給我輸出我需要一次我添加一個別名到外部選擇:)非常感謝你:) –