2011-10-08 18 views
5

ORDER BYMINUS sorgusu sonucu istiyorum.MINUS kullanarak sorguda nasıl SİMPEKTİRSİNİZ?

Benim ilk girişimi çalışmaz:

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

Bunu nasıl yapardın?

oops: Sadece ORDER BY foo yerine ORDER BY table2.foo yapıyordum. Şimdi çalışıyor.

+0

Her ikisi de aynı tablo mu? Peki neden eksi kullanıyorsunuz? – frail

+0

Üzgünüz, örnek. – ladookie

+0

'u değiştirdiğim şey, temel olarak pahalı bir işlemdir, tam tablo taraması gerektirir. Bu nedenle bazı örnek verileri gönderirseniz, belki bir birleştirmeyle çözülebilir (veriye bağlı olarak) Ve tüm verilere ihtiyacınız var mı? Tam tablo taramasından sakınacak bir sınırınız olabilir – frail

cevap

8

Ancak, soruyu cevaplamak için, bir sorgu ile kullanabilirsiniz:

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

Ayrıca subselect yapmak mümkün olmalıdır:

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

EKSİ UNION tarafından değiştirildiği takdirde, ORDER BY, UNION sonucuna uygulanacaktır. MINUS ile aldığın şeyin bu olmadığından emin misin?

o zaman, doğrudan işe yaramazsa:

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

Ancak, bu gerekli olması muhtemel olduğunu düşünüyorum.

1

Sütun adı yerine konumu kullanabilirsiniz. O foo varsayarsak sonuçlarında ilk sütundur:

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

Normalde sonuçları, belirli bir sütun sırasına bağlı istemiyorum, bu yüzden sadece anlık sorguları için bu kullanmak.

İlgili konular