gpt4 book ai didi

MySQL:我可以构建一个 IN 子句,将 SELECT 语句的结果和硬编码列表结合起来吗?

转载 作者:行者123 更新时间:2023-11-29 06:34:18 24 4
gpt4 key购买 nike

所以我正在尝试构建一个如下所示的查询:

SELECT p.* FROM Person p 
WHERE p.name IN ('jim', 'sally') OR p.name IN (SELECT name FROM goodNames)

现在这个查询工作正常,但它是一个性能关键查询,所以我希望能够组合两个 IN 子句,例如:

SELECT p.* FROM Person p 
WHERE p.name IN ('jim', 'sally', (SELECT name FROM goodNames))

(这会产生错误:子查询返回超过 1 行)

注意:“jim”和“sally”可能在 goodNames 中,也可能不在 goodNames 中,我想要 goodNames 的结果以及提供的列表中的结果

MySQL 有办法做到这一点吗?

谢谢!

最佳答案

当 OR 影响索引性能时(我想您会担心这一点),您可以采取不太理想的策略将它们转换为 UNION,如下所示:

SELECT p.* FROM Person p 
WHERE p.name IN ('jim', 'sally')
UNION
SELECT p.* FROM Person p
WHERE p.name IN (SELECT name FROM goodNames)

这并不理想,特别是对于复杂的查询,因为它涉及复制大部分查询(并且必须在更改之间维护这些重复项);但当它对性能足够重要时,这是一个相当标准的解决方案。

由于“维护成本”较高,我仅建议您在实际观察到原始版本存在性能问题时才这样做。


其他一些笨拙的替代方案......

WHERE p.name IN (
SELECT name FROM goodNames
UNION SELECT 'jim'
UNION SELECT 'sally'
)

将静态列表元素插入临时表,然后

WHERE p.name IN (
SELECT name FROM goodNames
UNION SELECT name FROM staticNames
)

哦,哈哈,还有一个(你又回到了 OR 的问题,但它是一种替代方案,可能会或可能不会以某种方式更好地利用索引):

SELECT p.* 
FROM Person p
LEFT JOIN goodNames AS g ON p.name = g.name
WHERE g.name IS NOT NULL OR p.name IN ('jim', 'sally')

关于MySQL:我可以构建一个 IN 子句,将 SELECT 语句的结果和硬编码列表结合起来吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54636806/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com