SQL“属于”逻辑

时间:2018-08-10 05:30:14

标签: sql logic belongs-to

因此,我一直试图用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

2 个答案:

答案 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;

enter image description here

Demo

请注意,如果未明确指定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)上建立索引。