2011-09-22 103 views
0

如下問題:SQL查詢:查詢依賴於前面的查詢和合並結果

查詢2和查詢3取決於查詢1的結果和查詢4取決於查詢2的結果,你會如何表達這些查詢沒有多次執行相同的查詢?

實施例:

查詢1

SELECT id, color, part FROM T1 

查詢2

SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1) 

查詢3

SELECT id from T3 where T3.part in (SELECT id, color, part FROM T1) 

查詢4

SELECT id from T4 where T4.owner in (SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1)) 

編輯

最後我需要的結果的工會現在

Query1 union Query2 union Query3 union Query4 

你可以看到,我已經複製並粘貼以前的查詢,必須有更好的方法來做到這一點。

+1

你可以使用JOIN代替 – Randy

+0

語法噢,對不起,我離開了,我有聯合每個查詢的結果 – user944308

+2

僅供參考如果您的聯合結果是不可能的,因爲您在每個結果集中使用**不同的字段** – JNK

回答

0

你真的需要四個不同的結果集嗎?您在每個集合中預期有多少行,以及T1,T2,T3,T4是什麼類型的實體 - 因爲可能將這些查詢合併到一個集合中。

此外,這樣的:

SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1) 

不是有效的SQL,你大概的意思:

SELECT id, owner FROM T2 WHERE T2.color in (SELECT color FROM T1) 
+0

對於sql錯誤感到抱歉...我只想提出一個簡單的例子,因爲一個我我正在與更多的compl例如,它們都具有相同的實體,但是原始表的子集 – user944308

+0

@ user944308子集是否定義爲視圖?這很難,因爲目前還不清楚T2與T1的關係。如果你用簡單的英語來解決問題可能會容易得多。 MySQL還不支持公用表表達式/子查詢因子分解,因此您可能必須重複子查詢。但是,這並不一定是壞的,因爲1)每種情況下的操作可能會單獨進行優化,或者2)優化程序可能會將它們組合在一起。我首先擔心代碼質量和可維護性,接下來的表現(在執行計劃中看到問題的證據後)。 –

+1

@ user944308,幾乎每次有人這樣簡單時,他們都會得到錯誤的答案,因爲複雜性是問題的一部分。請不要在將來做。 – HLGEM

1

只要加入他們的具體欄目。

select * from T1 
inner join T2 on T1.color=T2.color 
inner join T3 on T3.part=T1.part 
inner join T4 on T4.owner=T2.owner