2011-04-28 33 views
2

我有3個表有以下模式:SQL:獲取關於 'IN' 運算可能的值,從兩個不同的表

表1列:ID MSGNUM消息 表2列:ID MSGNUM SYSTEMID 表3列:ID MSGNUM IncidentNum

我想從表2和表3。

從表2選擇的一個值的範圍內的表1 MSGNUM所有項目,使用以下SQL獲得用於MSGNUM可能的值:

SELECT Table2.MsgNum from Table2 WHERE SystemId = 'Sys-0001' 

,並從表3,

SELECT Table3.MsgNum from Table3 WHERE IncidentNumber = 'Incident-0001' 

現在,我就喜歡用從以前的2條SELECT語句獲得MSGNUM值的組合,以獲得在表1中相應的行如下:

SELECT * from Table1 where MsgNum IN (SELECT Table2.MsgNum from Table2 WHERE SystemId = 'Sys-0001' OR SELECT Table3.MsgNum from Table3 WHERE IncidentNumber = 'Incident-0001') 

但是,此SQL使用Interactive SQL失敗。我究竟做錯了什麼?

+0

如果這些答案中的任何一個解決了您的問題,您應該將其標記爲答案,因爲這有助於社區稍後快速找到答案。 – 2011-05-06 17:56:05

回答

0

你的意思是工會嗎?

SELECT * 
from Table1 
where MsgNum IN 
( 
SELECT Table2.MsgNum from Table2 WHERE SystemId = 'Sys-0001' 
UNION 
SELECT Table3.MsgNum from Table3 WHERE IncidentNumber = 'Incident-0001' 
) 
+0

謝謝,謝謝。 – 2011-04-28 15:00:55

0

使用UNION命令將兩個查詢一起

SELECT * from Table1 where MsgNum IN (
SELECT Table2.MsgNum from Table2 WHERE SystemId = 'Sys-0001' 
    UNION 
    SELECT Table3.MsgNum from Table3 WHERE IncidentNumber = 'Incident-0001') 
) 
+0

嗯。聯盟做的伎倆,但我不明白馬丁發佈的關切。你能否詳細說明一下。 – 2011-04-28 15:00:15

2

你爲什麼不使用exists代替

SELECT * from Table1 t1 
where EXISTS (SELECT t2.MsgNum from Table2 t2 
WHERE t2.SystemId = 'Sys-0001' AND t2.MsgNum = t1.MsgNum) 
OR EXISTS (SELECT t3.MsgNum from Table3 t3 
WHERE t3.IncidentNumber = 'Incident-0001' AND t3.MsgNum = t1.MsgNum) 
+0

感謝您的回答。然而,聯盟看起來要複雜得多,特別是考慮到我的問題已經簡化了。所以我傾向於使用聯盟。 – 2011-04-28 15:04:28

+1

您應該嘗試_both._根據您的數據庫和MsgNum的分佈,可能會顯着更快。 (可能是UNION版本,但我已經學會不打賭SQL優化器行爲。) – 2011-04-28 15:08:54

相關問題