2009-09-15 38 views
57

Próbuję prześledzić niektóre SQL w Microsoft Server. Natknąłem się na połączenie, które używa niezrozumiałej dla mnie konwencji. Co oznacza "=*"?Co oznacza = *?

WHERE table1.yr =* table2.yr -1 
+47

oznacza to: przepisać mnie za pomocą nowej składni sql! –

+5

Jeśli jesteś wystarczająco dorosły, aby zapamiętać składnię ... –

+31

wysyła ci pocałunek –

Odpowiedz

71

to:

WHERE t.column =* s.column 

... jest stara składnia zewnętrznej TSQL (pre SQL Server 2005) i nie jest ANSI JOIN.

referencyjny: SQL Server 2005 Outer Join Gotcha

+10

Technicznie, to jest pre SQL Server 7. – Dave

+1

Również, od SQL Server 2012, nie ma możliwości, aby użyć tej składni, ponieważ zostały one usunięte Wersja 80 Tryb zgodności To dobrze. –

16

To jest stary styl składnia do wyrażania dołącza

+2

Ktoś jest głodny ... –

+2

@victor hugo Wciąż jestem nowicjuszem w tej sprawie, proszę bądź uprzejmy. Szczerze mówiąc, najpierw podszedłem do tego, po prostu próbując pomóc. Zabawna część, i odkryłem to przypadkowo, jest to, że dostajemy więcej powtórzeń dla tych nieświadomych, niż na wiele trudniejszych pytań. BĘDĄCIE dlaczego drażniłeś _me_ w tej sprawie, w porównaniu do późniejszych responderów z wyższym powtórzeniem/dłuższym członkostwem w SO? – mjv

+0

@mjv: Myślę, że Vitor naprawdę mnie drażnił. –

25

wierzę, że jest stary składnia wskazuje zewnętrzną dołączyć warunek z Tabela1 do tabela2

starym stylu:

SELECT * FROM table1, table2 
WHERE table1.yr =* table2.yr -1 

Nowość styl (SQL92):

SELECT * FROM table2 
LEFT OUTER JOIN table1 ON table1.yr = table2.yr - 1 
+2

Właściwie twój przykład nie jest poprawny. Jeśli naprawdę chcesz użyć lewego sprzężenia zewnętrznego, to wybierz: SELECT * FROM ** table2 ** LEFT OUTER JOIN ** table1 ** ON table1.yr = table2.yr-1 – Turismo

+0

@Turismo - dobry połów! zredagowałem moją odpowiedź, aby to poprawić. –

1

A ??? sprzężenie zewnętrzne jest określane za pomocą symbolu = * zamiast = w klauzuli WHERE.

+0

Przestań przygnębiać mnie, gwiazdka po PRAWEJ stronie oznacza, że ​​ta strona może zawierać wartości zerowe. Jest to lewe sprzężenie zewnętrzne. – alex

+0

Na pytanie "Czy * = lewy lub prawy sprzężenie zewnętrzne" nie można odpowiedzieć, ponieważ można napisać albo spośród A, B AC * = Bc lub z A, B na BC * = Ac Ten sam operator (* =), ale jedno jest LEWĄ łączeniem zewnętrznym, a jedno jest PRAWYM połączeniem zewnętrznym. Mimo to myślę, że się mylisz, a * idzie po stronie kolumny od zewnętrznego stołu, a nie od wewnętrznego stołu. Moralnym argumentem jest to, że jest to okropna składnia. Najbardziej podoba mi się odpowiedź HLGEM. –

+0

Mogę ci powiedzieć, że faktycznie próbowałem (i chłopakowi ciężko było napisać tę składnię, drżenie), że * = jest lewostronnym złączeniem. Dzięki za miłe słowa Steve. – HLGEM

2

To jest stary styl złączeń, które zostały wycofane w ANSI SQL92. Nowa składnia używa wewnętrznego i zewnętrznego JOIN który łączenia tabel na podstawie wyrażeń zamiast równości

0

yeap, to inna składnia lewe sprzężenie zewnętrzne

 
from 
table1 left outer join table2 on table1.yr = table2.yr - 1 
+0

i jest to również inna składnia dla prawego zewnętrznego sprzężenia : od table2 right outer join table1 na table1.yr = table2.yr - 1 –

11

Oznacza to, że kod należy natychmiast wymienić! To połączenie stylu ma być prawą złączką. Niestety, czasami będzie interpretowane jako sprzężenie krzyżowe, więc wyniki użycia tego sprzężenia mogą nie być poprawne. Również ta składnia jest przestarzała i nie może być używana w następnej wersji serwera SQl.

+4

Do tego, kto to zajął, powiedziałem to, ponieważ obecny kod jest według dowolnego standardu niepoprawny, ponieważ poprawne wyniki nie mogą być zagwarantowane nawet w SQL Server 2000. Stwierdzono nawet, że ten kod ma niespójne wyniki w Books Online dla SQL Server 2000.Opuszczenie tego kodu byłoby ryzykowne i nieprofesjonalne. – HLGEM

-1

Istnieje wiele głupich odpowiedzi tutaj. Nie podano klauzuli FROM, więc nie można określić, czy znak * = reprezentuje LEWE czy PRAWE połączenie zewnętrzne.

WHERE table1.yr =* table2.yr -1 

to stara składnia złącz zewnętrznych. Ale każdy, kto twierdzi, że wie, czy jest to LEWY czy PRAWY łącznik zewnętrzny, jest w błędzie. To zależy od kolejności, w której tabela 1 i tabela 2 są nazwane w klauzuli FROM, a to nie jest dane.

+0

Nie. * Wskazuje, która tabela jest zachowywana, więc w tym przykładzie tabela2 jest zachowywana. – JosephStyons

+0

Tak, tabela 2 jest zachowywana. Nie mówiłem inaczej. Ale wciąż nie możesz mi powiedzieć, czy jest to LEWY łącznik, czy PRAWE połączenie, prawda? –

+0

W starej składni zwykle używa się warunku łączenia, aby określić, która tabela jest LEWA, a która PRAWA. Kolejność w klauzuli FROM nie jest istotna. – Turismo

0
SELECT * 
FROM table1, table2 
WHERE table1.yr =* table2.yr -1 

Środki samo jak to:

SELECT * 
    FROM 
    table2 
    LEFT OUTER JOIN 
    table1 
    ON table1.yr = (table2.yr - 1) 

The * syntax is considered outdated i nie jest zgodna ze standardami ANSI.

Oracle has a similar construct tak:

WHERE table1.yr (+)= table2.yr 
+1

W rzeczywistości składnia Oracle jest odwrotna. Symbol (+) znajduje się po stronie wewnętrznego (lub opcjonalnego) stołu, ale gwiazda znajduje się po stronie zewnętrznego stołu. Więc table1.yr = * table2.yr będzie table1.yr (+) = table2.yr – Turismo

+0

tak, masz absolutną rację. Dzięki! – JosephStyons

0

jest proste i łatwe. To jest zewnętrzny operator sprzężenia SQL-92 (more info)

Nie używaj tego, jego bardzo stara szkoła, ale jest podobna do LEWEGO DOŁĄCZU, i DOŁĄCZ DO WŁAŚCIWEGO. Wszystko, co robisz, mówi, która strona łączenia jest stroną "Rodzica", więc wiersze z tej strony będą rozpatrywane jako pierwsze.

Jeśli spróbujesz uruchomić to w SQL 2005, spowoduje to błąd, mówiąc, że musisz uruchomić to w trybie zgodności.