我有两个表:
media_id | saved_language |
---|---|
000001 | 在 |
000002 | 在 |
media_id | media_title | data_language |
---|---|---|
000001 | 英文标题 | 在 |
000002 | 英文标题 | 在 |
000002 | 意大利语标题 | 它 |
我想加入这两个表,其中media_id相同,但是如果可以的话,语言必须是我输入的常量(例如“ it”),否则它应该使用将始终存在的监视列表中保存的默认语言。
我写的查询是这样的:
SELECT * FROM watchlist
LEFT JOIN media
ON media.media_id = watchlist.media_id
AND (media.data_language = "it" OR media.data_language = watchlist.saved_language)
但是,使用简单的OR显然可以同时获得两种语言。我已经尝试过使用CASE,但是结果相同。我想要的是为每个media_id保留一行,其中语言最好是“ it”,或者,只有在媒体表中不存在该语言时,才使用监视列表中保存的那行,该行将始终具有匹配项。
我想要的结果示例:
media_id | media_title | saved_language | data_language |
---|---|---|---|
000001 | 英文标题 | 在 | 在 |
000002 | 意大利语标题 | 在 | 它 |
您可以使用窗口功能:
SELECT w.*
FROM (SELECT wl.*, m.*,
ROW_NUMBER() OVER (PARTITION BY wl.media_id
ORDER BY (CASE m.data_language WHEN 'it' THEN 1 ELSE 2 END)
) as seqnum
FROM watchlist wl LEFT JOIN
media m
ON m.media_id = wl.media_id AND
m.data_language IN ('it', wl.saved_language)
) w
WHERE seqnum = 1;
但是,如果您只想要标题,那么两个联接似乎更简单:
select wl.*, coalesce(m_it.title, m_saved.title) as title
from watchlist wl left join
media m_it
on m_it.media_id = wl.media_id and
m_it.language = 'it' left join
media m_saved
on m_saved.media_id = wl.media_id and
m_saved.langauge = wl.saved_language;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句