因此,我一直试图用SQL编写查询,但遇到了问题。我正在尝试写一种“属于”条件。我想做的是,如果要获取的值属于另一张表中的一列,则填充一件事,否则填充null。
对于前。
NAME table
ID NAMES
1 A
2 B
3 C
4 D
5 E
XYZ table
ID
2
4
5
我这样写查询
(CASE WHEN NAME.ID IN (SELECT ID FROM XYZ) THEN NAME.NAMES ELSE NULL END ) AS 'ABC'
此查询确实运行,但是已经运行了14个小时(非常多的数据),仍然没有结果。这种逻辑是否存在缺陷,或者有更好的方法可以解决?
我希望得到这样的结果:
ABC
NULL
B
NULL
D
E
答案 0 :(得分:0)
您只需要在这里进行普通左连接即可:
SELECT
CASE WHEN t2.ID IS NOT NULL THEN t1.NAMES END AS ABC
FROM NAME t1
LEFT JOIN XYZ t2
ON t1.ID = t2.ID;
请注意,如果未明确指定CASE
表达式,则默认为NULL
。此行为之所以起作用,是因为如果NULL
表中的给定记录与NAME
表中的任何记录 not 不匹配,则您希望呈现XYZ
。>
答案 1 :(得分:0)
问题不是您的逻辑。这只是代码的优化方式。子查询可能正在外部查询的每一行运行。
我建议切换到exists
:
(case when exists (select 1 from xyz where xyz.id = name.id) then name.names
end) as abc
这保留了原始查询的语义。特别是,没有危险,xyz
中的重复项将返回多行(与left join
一样)。
为此(或left join
)的性能,您希望在xyz(id)
上建立索引。