SQL';属于';逻辑

SQL';属于';逻辑,sql,logic,belongs-to,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 NU

所以,我一直在尝试用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

您只需要在此处使用普通的左连接:

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
expressions-else条件如果未明确指定,则默认为
NULL
。如果
名称
表中的给定记录与
XYZ
表中的任何记录不匹配,则此行为在此处有效。问题不在于您的逻辑。这只是如何优化代码。子查询可能正在为外部查询中的每一行运行

我建议切换到
exists

(case when exists (select 1 from xyz where xyz.id = name.id) then name.names
 end) as abc
这将保持原始查询的语义。特别是,
xyz
中的重复项不会返回多行(如
左连接所发生的情况)


为了实现此功能,或者为了
左连接
,您需要使用哪个RDBMS的
xyz(id)

索引吗?我总是尝试在选择列表中避免子查询。我将保留Name.ID上的XYZ连接,然后在case语句中的key字段上检查null。至少我是这么认为的,你的问题不是很清楚。谢谢蒂姆,工作起来像个奇迹。但是你能告诉我我的逻辑有什么问题吗?我想知道出了什么问题以及原因。