我有两个表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,但也许它是不相关的。
我有两个表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,但也许它是不相关的。
SELECT id,
CASE
WHEN EXISTS (SELECT *
FROM B
WHERE B.A_id = A.id) THEN 'True'
ELSE 'False'
END AS InB
FROM A
有趣的方法。任何原因你通过外连接去做这件事? – Kuberchaun 2013-02-18 16:57:36
@JustBob - 在SQL Server中,它被优化为一个半连接。不知道PostgreSQL中是否也是如此。 – 2013-02-18 17:02:44
您实际上不需要Postgres中的情况,因为它具有真正的布尔数据类型。 – 2013-02-18 17:16:01
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
只需使用一个左外连接。
例如:
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
阅读上的外连接。我使用左外连接显示了一个解决方案。即使没有在其他表上找到任何表,也会带来所有行,这可以让您检查可选表是否返回值或返回空值,然后返回这个类型的问题。 – Kuberchaun 2013-02-18 16:54:27