2012-09-19 22 views
5

Dlaczego podczas korzystania z unijnych przed INNER JOIN jak tenUNION przed INNER JOIN

select some_table1.some_column1, 
      some_table1.some_column2 
    FROM some_table1 
    UNION ALL 
    select some_table2.some_column1, 
      some_table2.some_column2 
    FROM some_table2 
    INNER JOIN some_table3 
    ON some_table3.some_column1 = some_table1.some_column1 

Mam eror: nie można związany wieloczęściowe identifer "some_table3.some_column1"? Wszystkie typy danych są zgodne.

Odpowiedz

14

Otrzymujesz błąd, ponieważ nie jest to poprawna składnia SQL. UNION ALL Składnia jest następująca:

SELECT <column1> 
FROM <table1> 
UNION ALL 
SELECT <column1> 
FROM <table2> 

Nie można odwoływać się do kolumny z obu zapytania jak próbujesz zrobić. Jeśli chcesz się odwołać, będziesz chciał użyć czegoś takiego:

select * 
from 
(
    select some_table1.some_column1, some_table1.some_column2 
    FROM some_table1 
    UNION ALL 
    select some_table2.some_column1, some_table2.some_column2 
    FROM some_table2 
) t1 
INNER JOIN some_table3 
ON some_table3.some_column1 = t1.some_column1 
2

Próbujesz dołączyć some_table1 do some_table3, gdy some_table1 nie istnieje w drugiej połowie kwerendy, tylko pierwsza.

2

Zgaduję, że wybierasz się na coś takiego?

SELECT 
(
     select some_table1.some_column1, 
       some_table2.some_column2 
     FROM some_table1 
     UNION ALL 
     select some_table2.some_column1, 
       some_table2.some_column2 
     FROM some_table2 
) sub 
     INNER JOIN some_table3 
     ON some_table3.some_column1 = sub.some_column1 
+0

Tak, wygląda na to, co chcę. Jak rozumiem, muszę pogrupować wyniki przed użyciem INNER JOIN? –