我正在尝试使用IN关键字编写查询。
表A. attrId,attrName
表B. key,attrId,attrVal
根据提供的密钥,我想返回所有attrName,attrVal组合。结果将包含两个表中的列。在尝试练习使用IN关键字时,我不想使用attrId加入。
以下是我尝试的查询:
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。 你能帮忙吗? 感谢
答案 0 :(得分:3)
您的查询正在执行CROSS JOIN操作,从a
返回的每一行都是&#34;匹配&#34;来自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)
另一方面,使用带有相关子查询的IN
运算符的查询可以是&#34;慢&#34;如果1)子查询很慢和/或2)有很多行需要对子查询进行评估。
如果要返回满足某些条件的b
行,然后将这些行与a
中的行匹配,则应该通过为CROSS JOIN
提供一些条件来避免ON
操作match(SELECT a.attrName
, b.attrVal
FROM table_A a
JOIN table_B b
ON a.attrId = b.attrId
WHERE b.key = '<someKey>'
子句中的连接谓词)
例如:
UISearchController