SQL 'belong to' 逻辑

SQL 'belong to' logic

所以,我一直在尝试在 SQL 中编写查询,但遇到了问题。我正在尝试编写 'belongs to' 种条件。我想要做的是,如果要获取的值属于另一个 table 中的列,则填充一件事,否则填充 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

你只需要一个简单的左连接:

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;

Demo

注意一个CASE表达式else条件,如果没有明确指定,默认为NULL。此行为在这里有效,因为如果 NAME table 中的给定记录 notXYZ table.

问题不在于你的逻辑。这只是代码的优化方式。对于外部查询中的每一行,子查询可能是 运行。

我建议切换到 exists:

(case when exists (select 1 from xyz where xyz.id = name.id) then name.names
 end) as abc

这会保留原始查询的语义。特别是,xyz 中的重复不会有 return 多行的危险(就像 left join 中发生的那样)。

为了性能——或者为了 left join——你需要一个索引 xyz(id)