我遇到了在我的两张桌子上进行的有问题的查询。
我的表格可以简化为:
表A:
id
(PRIMARY KEY - id)
表B:
id (matches id from table A)
shop
active
(PRIMARY KEY id, shop)
现在我想从表A中选择商店2和3中的行,其中active = false,或者那些商店的行根本不存在。
例如,我有:
Table 1:
(1)
(2)
(3)
Table 2:
(1, 1, true)
(1, 2, false)
(2, 3, false)
(1, 3, true)
(3, 2, false)
(3, 3, false)
我应该得到id 2和3。 2 - 因为商店2的行不存在,商店3的行具有active = false。 3-因为它有两行active = false
答案 0 :(得分:0)
非常难以弄清楚你的意思,因为你似乎正在混淆你是否想要匹配的桌面B上的id或shop。您的示例数据似乎与您的描述不符。
然而,它看起来像LEFT OUTER JOIN,并检查WHERE子句中没有匹配的记录。在联接的ON子句中检查是否处于活动状态,以排除活动的匹配以及不匹配的匹配: -
SELECT TableA.id
FROM TableA
LEFT OUTER JOIN TableB
ON TableA.id = TableB.shop
AND TableB.active = true
WHERE TableB.id IS NULL
编辑 - 按照您的评论澄清列,这应该这样做。
它执行从TableA到TableB的LEFT OUTER JOIN,其中活动字段为true。任何匹配都意味着该记录被拒绝。这意味着您只会获得一个记录,其中TableB上没有该ID的记录,或者id上有匹配但active设置为false。
SELECT DISTINCT TableA.id
FROM TableA
LEFT OUTER JOIN TableB
ON TableA.id = TableB.id
AND TableB.active = true
WHERE TableB.id IS NULL