2011-06-21 17 views
9

PostgreSQL (7.4 ve 8.x) çalıştırıyor ve bunun çalıştığını düşündüm ama şimdi hata alıyorum.SQL SİPARİŞ FORMU UNION TÜM

Sorguları ayrı ayrı yürütebilirim ve gayet iyi çalışır, ancak UNION veya UNION ALL ise hata verir.

Bu hatalar dışarı: (Uyarı: pg_query(): Sorgu başarısız oldu: HATA: Sütun "Alan1" yok ... SİPARİŞ HALİNDE "Alan1" W TARAFINDAN ...)

SELECT "Field1" AS field_1, "Field2" AS field_2, 
"Field3" AS field_3, "Field4" AS field_4 
FROM "TableName" 
WHERE condition 
AND other_condition 
UNION ALL 
SELECT "Field1" AS field_1, "Field2" AS field_2, 
"Field3" AS field_3, "Field4" AS field_4 
FROM "TableName" 
WHERE yet_another_condition 
AND yet_another_other_condition 
ORDER BY CASE "Field1" 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
END 

Bu eserler :

SELECT "Field1" AS field_1, "Field2" AS field_2, 
"Field3" AS field_3, "Field4" AS field_4 
FROM "TableName" 
WHERE yet_another_condition 
AND yet_another_other_condition 
ORDER BY CASE "Field1" 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
END 

ve bu yanı çalışır:

SELECT "Field1" AS field_1, "Field2" AS field_2, 
"Field3" AS field_3, "Field4" AS field_4 
FROM "TableName" 
WHERE condition 
AND other_condition 
ORDER BY CASE "Field1" 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
END 

ve eğer SİPARİŞ BY atlanıp sadece TÜM bunu UNION veya UNION de çalışır.

Herhangi bir Fikir?

başka

cevap

13

koy şeyi SEÇ :

SELECT * FROM (
    SELECT "Field1" AS field_1, "Field2" AS field_2, 
    "Field3" AS field_3, "Field4" AS field_4 
    FROM "TableName" 
    WHERE condition 
    AND other_condition 
    UNION ALL 
    SELECT "Field1" AS field_1, "Field2" AS field_2, 
    "Field3" AS field_3, "Field4" AS field_4 
    FROM "TableName" 
    WHERE yet_another_condition 
    AND yet_another_other_condition 
) As A 
ORDER BY CASE field_1 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
END 

veya daha iyi, SİPARİŞ BY takma ad kullanmak, bu BİRLİĞİ sonunda geçirilir olarak:

SELECT "Field1" AS field_1, "Field2" AS field_2, 
    "Field3" AS field_3, "Field4" AS field_4 
    FROM "TableName" 
    WHERE condition 
    AND other_condition 
    UNION ALL 
    SELECT "Field1" AS field_1, "Field2" AS field_2, 
    "Field3" AS field_3, "Field4" AS field_4 
    FROM "TableName" 
    WHERE yet_another_condition 
    AND yet_another_other_condition 
    ORDER BY CASE field_1 
    WHEN 'A' THEN 1 
    WHEN 'B' THEN 2 
    WHEN 'C' THEN 3 
    ELSE 4 
    END 
+0

Çalışmıyor çünkü "Alan1" 'bir sütun adı değil. – Benoit

+0

üzgünüm, çalışmadı aynı hata –

+0

Evet, farkettim. Cevap değiştirildi .... – CristiC

1

İlki yapar Eğer

ORDER BY CASE field_1 

"Field1" tek alt sorguda yalnızca yapmalıyım çünkü çalışmak değil, UNION'u ortak bir takma adla oluşturduktan sonra, "Field1" olarak bu sütuna başvuramazsınız.

+0

+1. Bunu yaptım ama şu hatayı alıyorum: ERROR: BIR UNION/INTERSECT/EXCEPT sonucundan ORDER BY sonucu sonuç sütunlarından birinde olmalıdır –