2015-04-08 52 views
0

沒有與下面的表格數據庫:如何做到連續選擇在同一查詢

table_1: id, atr1 
table_2: id, atr2 
table_3: id, table_1_id(Foreign Key), table_2_id(Foreign Key), atr3 

我想說明的操作有點複雜,我可以解釋它從做一些額外的編程擱置SQL查詢。

該操作的第一部分將獲得滿足一些條件的table_3中table_2的所有標識符。

SELECT table_3.table_2_id 
FROM table_3 
WHERE 
table_3.atr3 = 'value1' AND 
table_3.table_1_id = 'value2' 

下一部分將採取我剛剛獲得的每個值,然後在以下查詢中使用它們。我會在循環中做到這一點。

SELECT table_3.id, table_3.atr3, table_1.atr1, table_2.atr2 
FROM table_3 
JOIN table_1 ON table_3.table_1_id = table_1.id 
JOIN table_2 ON table_3.table_2_id = table_2.id 
WHERE 
table_3.table_2_id = 'current_value_i_am_iterating_over' AND 
(table_3.table_1_id = 'value4' OR 
table_3.table_1_id = 'value5') 

查詢之後,我會在包含所有我在循環的連續迭代獲得的行的陣列串聯所獲得的行。

我想知道的是,如果有一種方法可以避免第二個循環,理想情況下只在一個SQL查詢中進行整個操作。

+0

你能提供sqlfiddle嗎? –

回答

2

難道你不能使用簡單的子查詢嗎?我的意思是,你可以有

table_3.table_2_id = (your first query with limit 1) 

限制1,只是爲了避免多條記錄從子查詢 返回,否則你可以使用IN

table_3.table_2_id IN (your first query) 
1

您可以短語查詢作爲in

SELECT t3.id, t3.atr3, t1.atr1, t2.atr2 
FROM table_3 t3 JOIN 
    table_1 t1 
    ON t3.table_1_id = t1.id JOIN 
    table_2 t2 
    ON t3.table_2_id = t2.id 
WHERE t3.table_2_id IN (SELECT table_2_id 
         FROM table_3 
         WHERE atr3 = 'value1' AND table_1_id = 'value2' 
         ) AND 
     t3.table_1_id IN ('value4', 'value5'); 

這是將邏輯添加到單個查詢中最直接的方法。

+1

您需要使用IN – cha

+0

@cha。 。 。這是真的。 –

0
;with cte as (
SELECT table_3.table_2_id 
FROM table_3 
WHERE 
table_3.atr3 = 'value1' AND 
table_3.table_1_id = 'value2') 

SELECT table_3.id, table_3.atr3, table_1.atr1, table_2.atr2 
FROM table_3 
JOIN table_1 ON table_3.table_1_id = table_1.id 
JOIN table_2 ON table_3.table_2_id = table_2.id 
JOIN cte on table_3.table_2_id = cte.table_2_id 
WHERE 
(table_3.table_1_id = 'value4' OR 
table_3.table_1_id = 'value5') 

使用公用表表達式並添加一個額外的連接,不需要循環它。