2015-06-04 56 views
1

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編號: '1' 具有 - 的 '1'>表B ID和「2 '和標籤'隱藏'和'顯示'附加到它。

我正在尋找一個SQL,只會在上面的示例中返回表A ID:'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在這裏會有幫助。

+1

儘量'選擇...,援助不是(選擇的B AID其中標籤='隱藏')' – mafafu

回答

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') 
+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' 
) 

或者,如果你想從表B中的數據:

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

輸入此錯誤,並認爲它不工作!完美的作品謝謝你。 –