我有这个问题:
SELECT (CASE WHEN A.name IS NULL THEN B.name ELSE A.name END)
FROM mytable A LEFT JOIN mytable B ON (A.related=B.id)
虽然有效,但JOIN
总是会发生,我的意思是JOIN
会出现这两种情况:
WHEN A.name IS NULL THEN B.name
ELSE A.name
我想避免这种情况。我的意思是我只想JOIN
只针对这种情况WHEN A.name IS NULL
而不是所有的时间(我的目的是避免无用的加入)。我怎么能这样做?
答案 0 :(得分:1)
我不确定这会更有效,但从技术角度来说使用correlated subquery
会删除额外的join
:
SELECT
CASE WHEN name IS NULL
THEN (SELECT name FROM mytable B WHERE A.related = b.id)
ELSE A.name
END
FROM mytable A
答案 1 :(得分:1)
你可能无法真正地部分避免加入,这可能;但它可能只是更快地进行原始连接,因为所有这些都可能会增加为每行比较计算的条件。
SELECT (CASE WHEN A.name IS NULL THEN B.name ELSE A.name END)
FROM mytable A
LEFT JOIN mytable B ON A.name IS NULL AND A.related=B.id
;
从技术上讲,这可以避免它,但我非常怀疑它会更快。
SELECT A.name
FROM mytable A
WHERE A.name IS NOT NULL
UNION
SELECT B.name
FROM mytable A
LEFT JOIN mytable B ON A.related=B.id
WHERE A.name IS NULL
;
编辑:第二个想法,在非常大的数据集上,这可能会有所帮助;但即便如此,在这种情况下你也不太可能选择整个表格内容。
答案 2 :(得分:1)
SELECT COALESCE(A.name, B.name) AS name
FROM mytable A
LEFT JOIN mytable B ON (A.related=B.id AND A.name IS NULL)