2017-06-29 35 views
0

最近選取了SQL,並且遇到特定相關子查詢的問題。如何修復相關子查詢中的變量(postgresql)

SELECT a.* 
FROM videos a 
WHERE EXISTS 
(SELECT NULL 
FROM actors b 
WHERE a.actor not ilike b.actor 
and a.title ilike ('%' + b.actor + '%')); 

從本質上講,我想找到那個在其標題中有一個演員的名字視頻表中的所有條目,但不能標記爲在視頻之中。上面的代碼只是返回表中的每個視頻,我猜測是因爲子查詢在兩行中都沒有使用相同的'b.actor'。我怎樣才能改變它來真正做我想要的?提前致謝。

+2

SQL中的字符串連接運算符是'||'不是'+' –

回答

0

首先,使用||而不是+來連接字符串。 然後,我會在視頻ID和收集演員的ID(如果有的話)使用LEFT JOIN找到影片和演員之間的正確關係,與GROUP BYarray_agg(..)

select 
    v.id as video_id, 
    array_agg(a.id) actors_ids 
from videos v 
left join actors a on 
    v.title ilike ('%' || a.actor || '%') 
    and v.actor not ilike a.actor 
group by 1 
; 

您可以刪除從結果集空演員行與HAVING。或者只是使用「INNER JOIN」只得到至少具有正確的連接者的視頻:

select 
    v.id as video_id, 
    array_agg(a.id) actors_ids 
from videos v 
join actors a on 
    v.title ilike ('%' || a.actor || '%') 
    and v.actor not ilike a.actor 
group by 1 
; 

最後,這整個使用ILIKE的做法將是,如果你的表是大的很慢。並不嚴格 - 在許多情況下,你會有錯誤的匹配(如「約翰」將匹配「Johnathan」)。

考慮規範化(https://en.wikipedia.org/wiki/Database_normalization#Normal_forms)並使用EAV模型(https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)或者使用整數數組或JSONB數據類型。