![](/img/trans.png)
[英]SQL Server - Return all records from LEFT table and only non matching records from right table
[英]What will be the query for fetching all the records from left table and matching records from the right tables?
從左表中獲取所有記錄並從右表中匹配記錄的查詢是什么?
表格:
特性:
id cid property_name
1 1 Property1
2 1 Property2
3 1 Property3
4 1 Property4
property_medias:
id cid property_id media_file_id
1 1 1 1
2 1 1 2
3 1 1 4
4 1 2 5
5 1 2 6
媒體文件
id cid media_alt
1 1 NULL
2 1 pqr
3 1 NULL
4 1 ttt
5 1 NULL
6 1 NULL
預期輸出:
id cid property_name media_alt
1 1 Property1 YES
2 1 Property2 NO
3 1 Property3 -
4 1 Property4 -
輸出說明: Property1 至少有一條記錄,media_alt IS NOT NULL 因此 media_alt 是“YES” Property2 有 media_alt 的所有記錄 NULL 因此 media_alt 是“NO” Property3 和 Property4 沒有任何與之關聯的媒體,因此 media_alt 是'-'。
我試過這個查詢,但它給了我重復的屬性記錄。
SELECT distinct p.id, p.property_name, mf.media_alt
FROM
properties AS p
JOIN property_medias pm ON ( pm.property_id = p.id AND pm.cid = p.cid)
JOIN media_files mf ON ( mf.id = pm.media_file_id AND mf.cid = pm.cid )
WHERE
p.cid = 1
ORDER BY p.property_name
請幫助我朝着正確的方向前進。
您正在描述LEFT JOIN
和GROUP BY
:
SELECT p.id, p.property_name,
(CASE WHEN COUNT(mf.media_alt) > 0 THEN 'YES'
WHEN COUNT(mf.cid) > 0 THEN 'NO'
ELSE '-'
END) as media_alt
FROM properties p LEFT JOIN
property_medias pm
ON pm.property_id = p.id AND pm.cid = p.cid LEFT JOIN
media_files mf
ON mf.id = pm.media_file_id AND mf.cid = pm.cid
WHERE p.cid = 1
GROUP BY p.id, p.property_name;
第一個COUNT()
確定是否有任何列值不是NULL
。 第二個是確定是否有任何匹配項。
您也可以使用EXISTS
:
SELECT p.id, p.property_name,
(CASE WHEN EXISTS (SELECT 1
FROM property_medias pm LEFT JOIN
media_files mf
ON mf.id = pm.media_file_id AND mf.cid = pm.cid
WHERE pm.property_id = p.id AND
pm.cid = p.cid AND
mf.media_alt IS NOT NULL
)
THEN 'YES'
WHEN EXISTS (SELECT 1
FROM property_medias pm
WHERE pm.property_id = p.id AND
pm.cid = p.cid
)
THEN 'NO'
ELSE '-'
END) as media_alt
FROM properties p
WHERE p.cid = 1;
這節省了外部聚合,但在 Postgres 中可能沒有任何性能優勢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.