Widziałem podobne błędy na SO, ale nie znalazłem rozwiązania mojego problemu. Mam zapytanie SQL, takie jak:
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen ,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a ,
quanhuyen b
LEFT OUTER JOIN ( SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND
'Sep 5 2011'
GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
Gdy wykonuję to zapytanie, wynikiem błędu jest:
Nie można powiązać wieloczęściowego identyfikatora „a.maxa”. Czemu?
P / s: jeśli podzielę zapytanie na 2 pojedyncze zapytania, będzie działać poprawnie.
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen
FROM phuongxa a ,
quanhuyen b
WHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
i
SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'
GROUP BY maxa;
sql
sql-server
sql-server-2005
PhamMinh
źródło
źródło
phuongxa
tabela zawiera kolumnęmaxa
?Odpowiedzi:
Mieszasz sprzężenia niejawne z połączeniami jawnymi. Jest to dozwolone, ale musisz wiedzieć, jak to zrobić poprawnie.
Chodzi o to,
JOIN
że sprzężenia jawne (te, które są implementowane za pomocą słowa kluczowego) mają pierwszeństwo przed niejawnymi (sprzężenia przecinkowe, w których warunek łączenia jest określony wWHERE
klauzuli).Oto zarys twojego zapytania:
Prawdopodobnie spodziewasz się, że zachowa się tak:
to znaczy kombinacja tabel
a
ib
jest łączona z tabelądkcd
. W rzeczywistości to, co się dziejeto znaczy, jak już zapewne zrozumiałeś,
dkcd
jest łączony specjalnie przeciwb
i tylkob
wtedy wynik połączenia jest łączony z klauzuląa
i dalej filtrowanyWHERE
. W tym przypadku wszelkie odniesienia doa
wON
klauzula jest nieważna,a
nie jest znany w tym punkcie. Dlatego pojawia się komunikat o błędzie.Gdybym był tobą, prawdopodobnie spróbowałbym przepisać to zapytanie, a jednym z możliwych rozwiązań może być:
Tutaj tabele
a
ib
są najpierw łączone, a następnie wynik jest łączonydkcd
. Zasadniczo jest to ta sama kwerenda, co twoje, tylko przy użyciu innej składni dla jednego z połączeń, co robi wielką różnicę: odwołaniea.maxa
wdkcd
warunku łączenia jest teraz absolutnie poprawne.Jak słusznie zauważył @Aaron Bertrand, prawdopodobnie powinieneś zakwalifikować się
maxa
z określonym aliasem, prawdopodobniea
wORDER BY
klauzuli.źródło
ORDER BY maxa
, dzięki. Jeśli chodzi o daty, uważam, że właśnie w ten sposób PO zdecydował się określić je w swoim otoczeniu.Czasami ten błąd występuje, gdy używasz swojego schematu (dbo) w zapytaniu w niewłaściwy sposób.
na przykład jeśli napiszesz:
dostaniesz błąd.
W takich sytuacjach zmień to na:
źródło
jeśli podałeś imię alies, zmień je na prawdziwe
na przykład
zmień to na
źródło
Zmagałem się z tym samym komunikatem o błędzie w SQL SERVER, ponieważ miałem wiele złączeń, zmiana kolejności złączeń rozwiązała to dla mnie.
źródło
W moim przypadku problemem okazał się pseudonim, który nadałem tabeli. „oa” wydaje się nie do przyjęcia dla SQL Server.
źródło
Miałem ten sam błąd z JDBC. Sprawdziłem wszystko i moje zapytanie było w porządku. Okazało się, w którym punkcie mam argument:
A wartość argumentu, który przekazałem, była zerowa. Daje to również ten sam błąd, który wprowadza w błąd, ponieważ podczas przeszukiwania Internetu okazuje się, że coś jest nie tak ze strukturą zapytań, ale w moim przypadku tak nie jest. Pomyślałem, że ktoś może zmierzyć się z tym samym problemem
źródło
Dla mnie zadziałała zmiana mojej klauzuli WHERE na podkwerendę SELECT
Z:
DO:
źródło
Jestem nowy w SQL, ale natknąłem się na ten problem na kursie, który przeprowadziłem i stwierdziłem, że przypisanie zapytania do projektu pomogło w wyeliminowaniu błędu wieloczęściowego. Na przykład projekt, który utworzyłem, to CTU SQL Project, więc upewniłem się, że rozpocząłem swój skrypt od USE [CTU SQL Project] jako mojej pierwszej linii, jak poniżej.
źródło
Jeśli ten błąd wystąpi
UPDATE
, sprawdź dwukrotnieJOIN
tabelę z kolumną / polem, które powoduje błąd.W moim przypadku wynikało to z braku
JOIN
samego siebie, który generował ten sam błąd z powodu nieznanego pola (jak zauważył Andriy ).źródło
Zamiast tego możesz spróbować dołączyć do tabel takich jak:
To powinno działać
źródło
źródło
Mój błąd polegał na użyciu pola, które nie istniało w tabeli.
table1.field1 => nie istnieje
table2.field1 => jest poprawny
Popraw swoją nazwę tabeli.
mój błąd wystąpił z powodu użycia Z
w połączeniu z innymi tabelami ...
źródło
Zapomniałeś dołączyć do niektórych stolików? Jeśli nie, prawdopodobnie musisz użyć niektórych aliasów.
źródło
Walczyłem również z tym błędem i skończyłem z tą samą strategią co odpowiedź. Podaję swoją odpowiedź, aby potwierdzić, że jest to strategia, która powinna zadziałać.
Oto przykład, w którym najpierw wykonuję jedno wewnętrzne połączenie między dwiema tabelami, o których wiem, że dostałem dane, a następnie dwa lewe zewnętrzne sprzężenia w tabelach, które mogą mieć odpowiednie wiersze, które mogą być puste. Łączymy połączenia wewnętrzne i połączenia zewnętrzne, aby uzyskać wyniki z danymi w różnych tabelach, zamiast wykonywać domyślną składnię oddzieloną przecinkami między tabelami i pominąć wiersze w żądanym złączeniu.
Po pierwsze: wykonaj wewnętrzne łączenia między tabelami, które mają mieć pasujące dane. Druga część: Kontynuuj z łączeniami zewnętrznymi, aby spróbować pobrać dane z innych tabel, ale to nie odfiltruje zestawu wyników, jeśli łączenie zewnętrzne tabeli nie ma odpowiednich danych lub nie odpowiada warunkom skonfigurowanym w predykacie / warunku.
źródło
Ten błąd może być również spowodowany brakiem przecinka
,
między nazwami kolumn w instrukcji SELECT.na przykład:
źródło