如何从表A中选择行,其中表B的JOIN与条件1匹配,或者条件2不存在

时间:2016-03-03 17:00:23

标签: mysql database

我遇到了在我的两张桌子上进行的有问题的查询。

我的表格可以简化为:

表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

1 个答案:

答案 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