簡體   English   中英

從左表中獲取所有記錄並從右表中匹配記錄的查詢是什么?

[英]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 JOINGROUP 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM