【问题标题】:Stop returning multiple similar rows on joins停止在连接上返回多个相似的行
【发布时间】:2025-12-18 20:15:03
【问题描述】:

我在 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' 有 -> '1' 和 '2' 的表 B ID 以及附加的标签 'Hide' 和 'Show'。

在上面的示例中,我正在寻找一个仅返回表 A ID:“2”和“3”的 SQL。 基本上,由于 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 在这里有什么帮助。

【问题讨论】:

  • 试试select ... where AID not in (select AID from B where Tag = 'Hide')

标签: sql sqlite select join distinct


【解决方案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')

【讨论】:

  • 感谢您的快速响应。非常感谢您!
【解决方案2】:

您正在寻找一个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' 
 )

【讨论】:

  • 输入错误并认为它不起作用!效果很好,谢谢。