您的查询返回符合指定条件的每一行。也就是说,它只检查单个行是否满足谓词,并返回所做的行,而不管没有行的行。
如果我明白你在问什么(我不完全确定我是这么做的),你说你想在某些行满足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'暗示这是两个表之间的公共关键。 –