Mysql 输入关键词
Mysql IN keyword
我正在尝试使用 IN 关键字编写查询。
Table一个
属性 ID、属性名称
Table乙
密钥、属性 ID、属性值
根据提供的密钥,我想要 return 所有 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
的每一行 return 正在 "matched" 来自 b
.
的每一行
您的查询等同于:
SELECT a.attrName
, b2.attrVal
FROM table_A a
CROSS
JOIN table_B b2
WHERE a.attrId IN ( <some_list> )
此查询不 return 任何行的唯一方法是 1) a
中没有行满足 WHERE
子句中的谓词,2) b2 不包含任何行,或 3) 查询的执行生成了太多的行,以至于它超出了一些可用资源(例如临时 space)并且 return 是一个错误,或者 4)客户端已经超时或之前取消了查询它完成了。
我知道您正在尝试编写一个使用 IN
运算符的查询,但是您发布的查询所设置的 return 确实没有多大意义。
问: 是使用 IN 关键字慢的查询,应该避免。
A: 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) 子查询很慢 and/or 2) 有很多必须评估子查询的行。
如果您想要 b
中满足某些条件的 return 行,然后将它们与 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>'
我正在尝试使用 IN 关键字编写查询。
Table一个 属性 ID、属性名称
Table乙 密钥、属性 ID、属性值
根据提供的密钥,我想要 return 所有 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
的每一行 return 正在 "matched" 来自 b
.
您的查询等同于:
SELECT a.attrName
, b2.attrVal
FROM table_A a
CROSS
JOIN table_B b2
WHERE a.attrId IN ( <some_list> )
此查询不 return 任何行的唯一方法是 1) a
中没有行满足 WHERE
子句中的谓词,2) b2 不包含任何行,或 3) 查询的执行生成了太多的行,以至于它超出了一些可用资源(例如临时 space)并且 return 是一个错误,或者 4)客户端已经超时或之前取消了查询它完成了。
我知道您正在尝试编写一个使用 IN
运算符的查询,但是您发布的查询所设置的 return 确实没有多大意义。
问: 是使用 IN 关键字慢的查询,应该避免。
A: 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) 子查询很慢 and/or 2) 有很多必须评估子查询的行。
如果您想要 b
中满足某些条件的 return 行,然后将它们与 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>'