2015-11-05 187 views
0

我有錶鏈接到表乙,其又連接到表C中從表SQL選擇的行,所有行接合匹配值

我可以從一個在B.

只得到C到關鍵

我必須從一所有行由C ALL聯行具有C.value =「Y」

我試過以下代碼,但一旦在C中的一個鏈接行中找到了匹配項,它就已經選擇了來自A的行,而不是來自C的所有鏈接行匹配C.value ='Y'。

SELECT * FROM A 
LEFT JOIN B ON A.ID1 = B.ID1 
LEFT JOIN C ON B.ID2 = C.ID2 
WHERE C.value = 'Y' 

有沒有辦法在SQL中做到這一點?

enter image description here enter image description here

+0

看看那張圖,'N'值是在B和C中,不是? –

+1

@JBKing我已更新圖表並添加了一個表格示例 – Enrico

+1

您是否考慮過執行排除查詢?可以更好地獲取哪些行取消資格。 –

回答

0

該查詢返回所有從A行,其中在C所有的鏈接行有C.value「Y '或者沒有與B或C可用的鏈接。關於JB King的建議。

SELECT * FROM A WHERE A.ID1 
NOT IN 
( 
    SELECT DISTINCT A.ID1 FROM A 
    JOIN B ON A.ID1=B.ID1 
    JOIN C ON B.ID2=C.ID2 WHERE C.value = 'N' 
) 
0

我想我現在明白了問題..嘗試。可能是更好的方法,但這應該起作用。

SELECT * 
FROM A 
LEFT JOIN B ON A.ID1 = B.ID1 
LEFT JOIN C ON B.ID2 = C.ID2 
WHERE C.ID2 in (SELECT ID2 FROM C WHERE VALUE = 'N') 
AND C.ID2 not in (SELECT ID2 FROM C WHERE VALUE <> 'N') 
+0

這給出了與我在我的問題中描述的第一次嘗試相同的結果,但沒有產生期望的結果。 – Enrico

+1

@Enrico期望的結果是什麼? – lookslikeanevo

0

您可以通過UNION ALL來做到這一點。 注:在select語句的列數應與

Select * 
FROM (
SELECT * FROM A 
UNION ALL 
SELECT * FROM B 
UNION ALL 
SELECT * FROM C 
)a 
where value ='N' 

更新:

Select * From A 
LEFT JOIN (Select * FROM B INNER JOIN C 
       ON B.columnName = C.ColumnName 
       WHERE C.Value ='N') z 
ON z.columnName = A.ColumnName 
+0

值字段僅在表C中可用,表A,B,C具有不同的列。 – Enrico

+0

哪個字段在A,B或B,C或A,C上是常見的。 – Maverick

+0

我已經添加了一個表格來澄清我的問題。 – Enrico

相關問題