sql >> Databáze >  >> RDS >> Sqlserver

Položky ORDER BY se musí objevit ve výběrovém seznamu, pokud příkaz obsahuje operátor UNION, INTERSECT nebo EXCEPT (SQL Server)

Pokud spouštíte dotaz na serveru SQL a zobrazí se následující chyba…

Msg 104, Level 16, State 1, Line 8
ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator.

...měli byste zkontrolovat svůj SQL příkaz – pravděpodobně jste vynechali sloupec z SELECT seznam.

Jak naznačuje chybová zpráva, pravděpodobně se vám tato chyba zobrazí pouze v případě, že spouštíte dotaz, který obsahuje UNION , INTERSECT nebo EXCEPT operátor.

Jednoduše přidejte sloupec do SELECT seznam by měl problém vyřešit.

Příklad

Zde je příklad generování chyby.

SELECT 
    CatName
FROM Cats
UNION ALL
SELECT 
    DogName 
FROM Dogs
ORDER BY CatId;

Výsledek:

Msg 104, Level 16, State 1, Line 8
ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator.

Problém je v tom, že se snažím objednávat podle CatId sloupec, ale ve skutečnosti tento sloupec nevybírám ve svém SELECT seznam.

Nejjednodušší způsob, jak to opravit, je přidat tento sloupec do mého SELECT seznam.

SELECT 
    CatId AS PetID,
    CatName AS PetName
FROM Cats
UNION ALL
SELECT 
    DogId AS PetID,
    DogName AS PetName
FROM Dogs
ORDER BY PetId;

Výsledek:

+---------+-----------+
| PetID   | PetName   |
|---------+-----------|
| 1       | Brush     |
| 1       | Yelp      |
| 2       | Scarcat   |
| 2       | Woofer    |
| 3       | Flutter   |
+---------+-----------+

Ve skutečnosti v mém případě vybírám sloupce s různými názvy (CatId vs DogId , CatName vs DogName ), tak jsem se rozhodl pro tyto sloupce použít alias (PetId a PetName ). V tomto případě mohu ORDER BY název aliasu (PetId ).


  1. Metadata týkající se typů záznamů na úrovni balíčků PL/SQL

  2. Jakou funkci maskování dat bych měl použít?

  3. DISTINCT pouze pro jeden sloupec

  4. Jak získat století z data v Oracle