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;
注意一个CASE
表达式else条件,如果没有明确指定,默认为NULL
。此行为在这里有效,因为如果 NAME
table 中的给定记录 not 与 XYZ
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)
。
所以,我一直在尝试在 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;
注意一个CASE
表达式else条件,如果没有明确指定,默认为NULL
。此行为在这里有效,因为如果 NAME
table 中的给定记录 not 与 XYZ
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)
。