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

时间:2015-06-04 16:48:26

标签: sql sqlite select join distinct

我在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如何在这里提供帮助。

2 个答案:

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