我在SQLite中有以下场景。
TableA
ID
-----
1 |
2 |
3 |
Table B
ID | AID |Tag
----------------
1 | 1 | Hide
2 | 1 | Show
3 | 2 | Null
4 | 3 | Show
表B的列AID是表A的ID。
在上面的例子中 表A ID:'1'具有 - >表B“1”和“2”的ID以及附加的标签“隐藏”和“显示”。
我正在寻找一个只会在上面的示例中返回表A ID的SQL:'2'和'3'。 基本上,作为TableA ID:'1'附加了一个'Hide'标签,不要返回它(即使它还附有一个show标签)
我正在使用的SQL是(借助名称,这只是一个简单的例子)
select
a.ID as a_ID,
b.ID as b_ID,
b.Tag as Tag
from
Table A as a
left join Table B on a.id = b.aID
and b.tag != 'hide'
这个SQL仍然存在问题
a_ID | b_ID | Tag
-------------------------------
1 | 2 | Show
我有点卡住,任何帮助都会非常感激。我不是100%肯定我会如何处理谷歌搜索。 我得到的最接近的是这个问题How to return only 1 row if multiple duplicate rows and still return rows that are not duplicates? 但我无法弄清楚GROUP BY如何在这里提供帮助。
答案 0 :(得分:3)
您正在寻找id
,其中不存在带有“隐藏”标记的行。这是直接转换为SQL:
select *
from TableA as a
where not exists
(
select *
from TableB as B
where a.id = b.aID
and b.tag = 'hide'
)
或者,如果你想要TableB中的数据:
select *
from TableB as t1
where not exists
(
select *
from TableB as t2
where t1.aID = t2.aID
and t2.tag = 'hide'
)
答案 1 :(得分:1)
您可以使用exists
运算符的额外条件:
SELECT a.ID AS a_ID, b.ID AS b_ID, b.Tag AS Tag
FROM table_a a
LEFT JOIN table_b b ON a.id = b.aID
WHERE NOT EXISTS (SELECT *
FROM table_b bin
WHERE bin.aID = a.ID AND bin.Tag = 'hide')