我正在尝试使用 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/