SQL';属于';逻辑
所以,我一直在尝试用SQL编写查询,但遇到了一个问题。我试图写一个“属于”的状态。我要做的是,如果要获取的值属于另一个表中的列,则填充一个值,否则填充null。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
例如
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。至少我是这么认为的,你的问题不是很清楚。谢谢蒂姆,工作起来像个奇迹。但是你能告诉我我的逻辑有什么问题吗?我想知道出了什么问题以及原因。