Pokud se vám při pokusu o použití UNION
zobrazuje „Chyba:připravuje se, SELECTy nalevo a napravo od UNION nemají stejný počet sloupců výsledků…“ operátor v SQLite, je to proto, že jeden z SELECT
příkazy vrací více sloupců než ostatní.
Když použijete UNION
operátor, oba SELECT
příkazy musí vrátit stejný počet sloupců.
Chcete-li tento problém vyřešit, zkontrolujte SELECT
příkazy vrátí stejný počet sloupců.
Příklad chyby
Zde je příklad kódu SQL, který způsobuje chybu:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Výsledek:
Chyba:v přípravě nemají SELECT vlevo a vpravo od UNION stejný počet sloupců výsledků (1)
Zde je první SELECT
příkaz vrátí jeden sloupec (TeacherName
), ale druhý SELECT
příkaz vrátí dva sloupce (StudentId
a StudentName
).
Řešení
Způsob, jak tento problém vyřešit, je zajistit obě možnosti SELECT
příkazy vrátí stejný počet sloupců
Takže pomocí výše uvedeného příkladu můžeme buď odstranit nadbytečný sloupec z našeho druhého SELECT
prohlášení:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Výsledek:
Jméno učitele-----------Ben Bill Cathy Ein Faye Jet Spike Warren
Nebo můžeme přidat další sloupec do prvního SELECT
prohlášení:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Výsledek:
Id učitele Jméno učitele--------- -----------1 Faye 1 Warren 2 Ben 2 Jet 3 Cathy 3 Spike 4 Cathy 4 Ein 5 Bill 5 Warren 6 Bill
Mějte na paměti, že můžete získat různé výsledky v závislosti na tom, kterou možnost zvolíte. Důvodem je UNION
ve výchozím nastavení vrací odlišné řádky. Když přidáme další sloupec, existuje možnost, že z dříve duplicitního řádku se nyní stane jedinečný řádek v závislosti na hodnotě ve sloupci navíc.
Můžeme také použít UNION ALL
, který vrací duplicitní hodnoty:
SELECT TeacherId, TeacherName FROM Teachers
UNION ALL
SELECT StudentId, StudentName FROM Students;
Výsledek:
Id učitele Jméno učitele--------- -----------1 Warren 2 Ben 3 Cathy 4 Cathy 5 Bill 6 Bill 1 Faye 2 Jet 3 Spike 4 Ein 5 Warren 6 Bill