停止在连接上返回多个相似的行

Stop returning multiple similar rows on joins

我在 SQLite 中有以下场景。

TableA 

ID
-----
1   |
2   |
3   |


Table B

ID  | AID   |Tag
----------------
1   | 1     | Hide 
2   | 1     | Show
3   | 2     | Null
4   | 3     | Show 

Table B 的 AID 列是 table A 的 ID。

在上面的例子中 Table ID: '1' 有 -> Table“1”和“2”的 B ID 以及附加的标签 'Hide' 和 'Show'。

我正在寻找一个 SQL,它只会 return,在上面的示例中,Table A ID:“2”和“3”。 基本上,因为 TableA ID: '1' 附加了一个 'Hide' 标签,所以不要 return 它(即使它也附加了一个显示标签)

我正在使用的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 的问题还在 returning

a_ID    | b_ID  | Tag
-------------------------------
1       | 2     | Show

我有点卡住了,非常感谢任何帮助。我不是 100% 确定我将如何处理 google 搜索。 我得到的最接近的是这个问题 How to return only 1 row if multiple duplicate rows and still return rows that are not duplicates? 但我不知道 GROUP BY 在这里有什么帮助。

您可以使用带有 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')

您正在查找 id,其中不存在带有 'hide' 标记的行。这是直接翻译成 SQL:

select *
from TableA as a
where not exists
 (
   select * 
   from TableB as B 
   where a.id = b.aID
     and b.tag = 'hide' 
 )

或者,如果您想要表 B 中的数据:

select *
from TableB as t1
where not exists
 (
   select * 
   from TableB as t2 
   where t1.aID = t2.aID
     and t2.tag = 'hide' 
 )