您的查詢返回符合指定條件的每一行。也就是說,它只檢查單個行是否滿足謂詞,並返回所做的行,而不管沒有行的行。
如果我明白你在問什麼(我不完全確定我是這麼做的),你說你想在某些行滿足t1.id上的謂詞時返回一個「空集」,但至少有一個在t2中沒有匹配行的t1中的行。
要檢查是否有行沒有在T2「匹配」,我們可以使用反連接模式(還有其他的方法,以及...
SELECT SUM(1) AS t1_rows_not_matched
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.id = t1.id
WHERE t1.pID IN (45, 67, 88, 32)
AND t2.id IS NULL
去拿到納入您查詢時,您可以使用,作爲一個內嵌視圖,包括謂詞來檢查不匹配的行數,例如:
SELECT d.key
, d.value
FROM (SELECT SUM(1) AS cnt_rows_not_matched
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.id = t1.id
WHERE t1.pID IN (45, 67, 88, 32)
AND t2.id IS NULL
) c
CROSS
JOIN table1 d
WHERE d.pID IN (45, 67, 88, 32)
AND c.cnt_rows_not_matched = 0
這可能不是回答你問的問題,但它不是清楚你在問什麼。
每行都單獨檢查。如果滿足謂詞,它將被返回。只有在沒有匹配的行時,您發佈的查詢纔會返回空集。
您可能希望檢查是否至少有一行匹配列表中包含的每個pID
值。也就是說,例如,如果沒有行的pID值爲32
,那麼您希望查詢返回一個空集,而不是符合條件的行集。
SELECT d.key
, d.value
FROM (SELECT SUM(1) AS cnt_rows_not_matched
FROM table1 t1
LEFT
JOIN table2 t2
ON t2.id = t1.id
WHERE t1.pID IN (45, 67, 88, 32)
AND t2.id IS NULL
) c
CROSS
JOIN (SELECT COUNT(DISTINCT f.pID) AS cnt_pid
FROM table1 f
WHERE f.pID IN (45, 67, 88, 32)
) p
CROSS
JOIN table1 d
WHERE d.pID IN (45, 67, 88, 32)
AND c.cnt_rows_not_matched = 0
AND p.cnt_pid = 4
如果你加入2個表之間的公用密鑰的數據是什麼? –
2之間沒有共同的關鍵...對不起 –
't2.id = t1.pID'暗示這是兩個表之間的公共關鍵。 –