Ear*_*ind 5 sql postgresql select join substitution
我正在尝试构建一个执行以下操作的PostgreSQL查询,但到目前为止,我的努力一直都是徒劳的.
问题: 有两个表:A和B.我想从表A中选择所有列(具有列:id,name,description),并将"A.name"列替换为"B"列的值.标题"来自表B(具有列:id,table_A_id标题,langcode),其中B.table_A_id是5,而B.langcode是"nl"(如果有任何行).
我的尝试:
SELECT A.name,
case when exists(select title from B where table_A_id = 5 and langcode= 'nl')
then B.title
else A.name
END
FROM A, B
WHERE A.id = 5 and B.table_A_id = 5 and B.langcode = 'nl'
-- second try:
SELECT COALESCE(B.title, A.name) as name
from A, B
where A.id = 5 and B.table_A_id = 5 and exists(select title from B where table_A_id = 5 and langcode= 'nl')
Run Code Online (Sandbox Code Playgroud)
我尝试过使用CASE和COALESCE(),但由于我对这两个概念缺乏经验而失败了.
提前致谢.
我敢打赌,araqnid 就是您正在寻找的答案。
但是,如果您想强制为每个原始匹配行返回不超过一行A
,您可能更愿意执行子选择而不是 LEFT JOIN。例如:
SELECT A.id, COALESCE(
( SELECT max(B.title) FROM B WHERE
langcode = 'nl' AND B.table_a_id = A.id), A.name ) as name
FROM A
WHERE A.id = 5
Run Code Online (Sandbox Code Playgroud)
如果有多个值,我在这里使用“ max ”来选择任意值。您可以使用“ min ”或任何您认为适合您的情况的值。
也许这比 LEFT JOIN 更容易理解,但是(除了两者不完全等同)JOIN 的性能会比 N 个子选择更好(N 越大越好)。
不管怎样,从学习的角度来看,两者都了解一下还是有好处的。