我在MySQL中有一个类似于以下内容的查询:
SELECT City, Country FROM Customers
WHERE Country IN (Select Country from Countries Where ID > 5) limit 1
UNION
SELECT City, Country FROM Suppliers
WHERE Country IN (Select Country from Countries Where ID > 5) limit 1
ORDER BY City;
有没有办法抽象出
WHERE Country IN (Select Country from Countries Where ID > 5)
有类似的东西:
SELECT City, Country FROM Customers
WHERE Country IN t1 limit 1
UNION
SELECT City, Country FROM Suppliers
WHERE Country IN t1 limit 1
ORDER BY City
WHERE t1 = Select Country from Countries Where ID > 5;
答案 0 :(得分:1)
不,您无法以有效的方式在in
运算符中抽象查询。联合中的查询彼此独立,因此任何抽象意味着您必须创建可从两个查询访问的数据集。
在mysql的生产版本中,您只有两个选项:
创建一个临时表并从中选择
如删除的答案所示:首先将两个选择查询结果合并为派生表,然后对其进行过滤。
两者都没有效率。
在v8.0的alpha版本中,你可以使用CTE,效率稍高一些。但实际情况是,在union中,mysql会单独执行查询,并且mysql可以很容易地优化这样的标准。