在UNION中抽象出一个WHERE子句

时间:2017-04-25 22:57:30

标签: mysql sql

我在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;

1 个答案:

答案 0 :(得分:1)

不,您无法以有效的方式在in运算符中抽象查询。联合中的查询彼此独立,因此任何抽象意味着您必须创建可从两个查询访问的数据集。

在mysql的生产版本中,您只有两个选项:

  1. 创建一个临时表并从中选择

  2. 如删除的答案所示:首先将两个选择查询结果合并为派生表,然后对其进行过滤。

  3. 两者都没有效率。

    在v8.0的alpha版本中,你可以使用CTE,效率稍高一些。但实际情况是,在union中,mysql会单独执行查询,并且mysql可以很容易地优化这样的标准。