我有兩個表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