2011-10-08 47 views
5

我想ORDER BYMINUS查询的结果。在使用MINUS的查询中,你如何使用ORDER BY?

我第一次尝试不起作用:

SELECT * 
FROM Table1 
MINUS 
SELECT * 
FROM table2 
WHERE table2.foo = 'bar' 
ORDER BY foo 

你会怎么做呢?

oops:我在做ORDER BY table2.foo而不只是ORDER BY foo。现在它可以工作。

+0

他们都是同一张桌子我猜?所以你为什么使用减号? – frail

+0

对不起,不好的例子。我改了它 – ladookie

+0

你在做什么基本上是一个昂贵的操作,需要全表扫描。所以如果您可以发布一些示例数据,也许可以通过连接来解决(取决于数据)并且您是否需要所有数据?你可以有一个限制,可以避免全表扫描 – frail

回答

8

然而,要回答你的问题,你可以使用与查询:

with tmp_minus as (
    SELECT * 
    FROM Table1 
    MINUS 
    SELECT * 
    FROM table2 
    WHERE table2.foo = 'bar' 
) 
select * from tmp_minus 
ORDER BY foo 

你也应该能够做到一个子查询:

select * from (
    SELECT * 
    FROM Table1 
    MINUS 
    SELECT * 
    FROM table2 
    WHERE table2.foo = 'bar' 
) tmp_minus 
ORDER BY foo 
1

如果减号是由UNION取代, ORDER BY将适用于UNION的结果。你确定这不是你用MINUS得到的吗?

如果它不直接工作,那么:

SELECT result.* 
    FROM (SELECT * 
      FROM Table1 
     MINUS 
     SELECT * 
      FROM table2 
     WHERE table2.foo = 'bar') AS result 
ORDER BY foo; 

不过,我觉得这是不太可能是必要的。

1

您可以使用位置而不是列名称。假设foo是在结果第一列:

SELECT * 
FROM Table1 
MINUS 
SELECT * 
FROM table2 
WHERE table2.foo = 'bar' 
ORDER BY 1 

你通常不想要的结果取决于特定的列顺序,所以我只会用这个即席查询。