2013-02-18 67 views
1

我有兩個表A和B. 它們的關係是A的has_many B.結果集中示出,如果一個行是在表或不

中的行可以是B,或沒有。

那麼,如何檢索A中的所有行,並且在結果集中有一個字段,對每一行說明是否在B中?

例如,A具有這些編號:1,2,3,4,5

而B具有這些A_ids:1,2,3

所以結果集將是:

1 true 
2 true 
3 true 
4 false 
5 false 

我使用PostgreSQL,但也許它是不相關的。

+0

閱讀上的外連接。我使用左外連接顯示了一個解決方案。即使沒有在其他表上找到任何表,也會帶來所有行,這可以讓您檢查可選表是否返回值或返回空值,然後返回這個類型的問題。 – Kuberchaun 2013-02-18 16:54:27

回答

1
SELECT id, 
     CASE 
     WHEN EXISTS (SELECT * 
         FROM B 
         WHERE B.A_id = A.id) THEN 'True' 
     ELSE 'False' 
     END AS InB 
FROM A 
+0

有趣的方法。任何原因你通過外連接去做這件事? – Kuberchaun 2013-02-18 16:57:36

+0

@JustBob - 在SQL Server中,它被優化爲一個半連接。不知道PostgreSQL中是否也是如此。 – 2013-02-18 17:02:44

+0

您實際上不需要Postgres中的情況,因爲它具有真正的布爾數據類型。 – 2013-02-18 17:16:01

0
select distinct 
    a.id, 
    case when b.a_id is null then 'false' else 'true' 
from 
    a left join b on b.a_id = a.id 
0

只需使用一個左外連接。

例如:

CREATE TABLE a (a_id INTEGER); 
CREATE TABLE b (b_id INTEGER, a_id INTEGER); 


    INSERT INTO a(a_id) 
    VALUES (1), (2), (3); 

    INSERT INTO b(b_id,a_id) 
    VALUES (1,3); 

    select a.a_id, 
     CASE WHEN b.a_id IS NULL THEN 'FALSE' ELSE 'TRUE' END  
    from a 
    left join b 
     on b.a_id = a.a_id; 





    result: 
    1|FALSE 
    2|FALSE 
    3|TRUE 
相關問題