2013-02-18 60 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 
相关问题