2010-09-01 12 views
10

Do przykładów nie wiem ile wierszy w każdej tabeli są i staram się robić to tak:Zastosowane oświadczenia SELECT mają różną liczbę kolumn

SELECT * FROM members 
UNION 
SELECT * FROM inventory 

Co mogę umieścić na drugim SELECT zamiast * usunąć ten błąd bez dodawania NULL?

+6

Dlaczego chcesz połączyć dwie tabele o zupełnie różnych kontekstach? – Joe

+2

Należy nigdy nie używać opcji select * w zapytaniu, które będzie uruchamiane podczas produkcji. Powinieneś zawsze określać tylko te kolumny, które potrzebujesz, zarówno pod względem utrzymania, jak i wydajności. – HLGEM

Odpowiedz

9

Nazwy kolumn należy jawnie zamiast * i upewnić się, że liczba kolumn i typów danych pasuje do tej samej kolumny w każdym zaznaczeniu.

Aktualizacja:

ja naprawdę nie sądzę chcesz być UNIONing tych tabel, na podstawie nazw tabel. Nie wydają się zawierać powiązanych danych. Jeśli umieścisz swój schemat i opiszą, co próbujesz osiągnąć, najprawdopodobniej możemy zapewnić lepszą pomoc.

+0

Nic nie wiem o żadnych imionach, nic. Czy to nadal możliwe? –

+0

Dlaczego zostało to odrzucone? –

+1

@hey: Użyj 'DESC twoja_nazwa_fabryczna', aby znaleźć kolumny i ich typy danych przed napisaniem zapytania UNION. –

6

można zrobić

SELECT * 
from members 
UNION 
SELECT inventory.*, 'dummy1' AS membersCol1, 'dummy2' AS membersCol2 
from inventory; 

Gdzie membersCol1, membersCol12, itp ... to nazwy kolumn z members, które nie są w inventory. W ten sposób oba zapytania w unii będą miały te same kolumny (Zakładając, że wszystkie kolumny w inventory są takie same jak w members, co wydaje mi się bardzo dziwne ... ale hej, to twój schemat).

UPDATE:

Jak HLGEM podkreślił, będzie to tylko praca jeśli inventory ma kolumn o takich samych nazwach jak members, w tej samej kolejności. Nazewnictwo wszystkich kolumn jawnie jest najlepszym pomysłem, ale ponieważ nie znam nazw, nie mogę tego dokładnie zrobić. Jeśli ja, może to wyglądać mniej więcej tak:

SELECT id, name, member_role, member_type 
from members 
UNION 
SELECT id, name, '(dummy for union)' AS member_role, '(dummy for union)' AS member_type 
from inventory; 

nie lubię przy użyciu NULL dla wartości atrapy bo to nie zawsze jest jasne, jaka część unii rekord pochodził z - używając „manekina” sprawia, że jasne, że zapis pochodzi z części związku, która nie miała tego zapisu (choć czasami może to nie mieć znaczenia). Sam pomysł połączenia tych dwóch tabel wydaje mi się bardzo dziwny, ponieważ bardzo wątpię, że mają one więcej niż 1 lub 2 kolumny o tej samej nazwie, ale zadałeś to pytanie w taki sposób, że wyobrażam sobie w twoim scenariuszu, że w jakiś sposób ma sens.

+1

Dlaczego nie używać 'NULL' zamiast" dummy1 "i" dummy2 "? – dan04

+0

Nawet jeśli to zadziała, nadal musisz podać nazwy kolumn, ponieważ kolumny mogą, ale nie muszą być w tej samej kolejności na obu tabelach (lub pozostać w tej samej kolejności na zawsze). Plus, jeśli inwentaryzacja będzie miała dodaną kolumnę, związek pęknie. Nigdy nie używaj UNOIN bez określania kolumn. Również wszystkie związki zawodowe należy uznać za kandydatów do organizacji UNION ALL, która jest znacznie bardziej wydajna, jeśli nie ma możliwości oszustw, które należy odfiltrować. – HLGEM

+0

Mówienie, jak zrobić coś, co jest oczywiście oczywiste, szkodzi biednemu, zadając pytanie, nie pomagając mu. – ErikE

2

Czy na pewno nie chcesz zamiast tego łączenia? Jest mało prawdopodobne, że UNOIN da ci to, co chcesz, biorąc pod uwagę nazwy tabel.

0

Nie wiem, ile wierszy w każdej tabeli

Czy jesteś pewien, że to nie jest to, co chcesz?

SELECT 'members' AS TableName, Count(*) AS Cnt FROM members 
UNION ALL 
SELECT 'inventory', Count(*) FROM inventory 
Powiązane problemy