gpt4 book ai didi

Mysql IN 关键字

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:35 27 4
gpt4 key购买 nike

我正在尝试使用 IN 关键字编写查询。

表A 属性标识、属性名称

表B key 、属性标识、属性值

根据提供的 key ,我想返回所有 attrName、attrVal 组合。结果将包含两个表中的列。我不想使用 attrId 连接,因为我正在尝试练习 IN 关键字的用法。

下面是我尝试过的查询:

Select a.attrName, b2.attrVal
from table_A AS a, table_B AS b2
where a.attrId in (Select b1.attrId from Table_B b1 where key = <someKey>)

但是我没有得到任何查询结果。使用 IN 关键字的查询也很慢,应该避免。我在 table_A 中有大约 500 个条目,在 table_B 中有 500k 个条目。对我来说,另一种选择是从 table_B 中获取所有 attrId,然后为检索到的每个 attrId 触发多个 jdbc 查询以获取相应的 attrName。你能帮忙吗?谢谢

最佳答案

您的查询正在执行 CROSS JOIN 操作,从 a 返回的每一行都与从 b 返回的每一行“匹配”。

您的查询等同于:

SELECT a.attrName
, b2.attrVal
FROM table_A a
CROSS
JOIN table_B b2
WHERE a.attrId IN ( <some_list> )

此查询不返回任何行的唯一方法是 1) a 中没有行满足 WHERE 子句中的谓词,2) b2 不包含任何行,或 3) 查询的执行生成了太多的行,以至于它超出了一些可用资源(例如临时空间)并返回错误,或者 4) 客户端在查询完成之前超时或取消了查询。

我知道您正在尝试编写一个使用 IN 运算符的查询,但是您发布的查询返回的集合确实没有多大意义。


问:是使用 IN 关键字的查询,速度慢,应该避免。

答: IN 运算符本身不一定会使查询变慢。

例如:

SELECT t.id FROM mytable t WHERE t.id = 2 OR t.id = 3 OR t.id = 5

可以使用 IN 运算符重写为:

SELECT t.id FROM mytable t WHERE t.id IN (2,3,5)

另一方面,如果 1) 子查询很慢和/或 2) 有很多行需要必须评估子查询。


如果你想从 b 返回满足某些条件的行,然后将它们与 a 中的行匹配,你应该避免 CROSS JOIN 操作,通过为匹配提供一些条件(ON 子句中的连接谓词)

例如:

SELECT a.attrName
, b.attrVal
FROM table_A a
JOIN table_B b
ON a.attrId = b.attrId
WHERE b.key = '<someKey>'

关于Mysql IN 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30159570/

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