2009-02-04 4 views
14

muszę utworzyć zadanie w tle, który przetwarza tabeli szukasz wierszy odpowiadających na określonym identyfikatorze z różnych stanów. Przechowuje dane wiersza w ciągu, aby porównać dane z wierszem z pasującym identyfikatorem.W jaki sposób porównać 2 wierszy z tej samej tabeli (SQL Server)

znam składni, aby uzyskać dane wierszy, ale nigdy nie próbowałem porównać 2 wierszy z tej samej tabeli przed? Jak to jest zrobione? Czy muszę używać zmiennych do przechowywania danych z każdego z nich? Lub w inny sposób?

(przy użyciu programu SQL Server 2008)

Odpowiedz

10

ok, po 2 latach w końcu czas, aby poprawić składnię:

SELECT t1.value, t2.value 
FROM MyTable t1 
JOIN MyTable t2 
ON  t1.id = t2.id 
WHERE t1.id = @id 
     AND t1.status = @status1 
     AND t2.status = @status2 
+3

NIE powinieneś używać tej składni. Zamiast tego użyj konkretnych połączeń. Lewe i prawe łączenie formularzy tej składni są przestarzałe. Nie zdziwiłbym się, gdyby ta forma została uznana za przestarzałą w następnej wersji. – HLGEM

+0

@HLGEM - Czy możesz podać linki dotyczące tego, gdzie jest to wymienione jako nieaktualne? – Pauk

+3

@Pauk ms-help: //MS.SQLCC.v10/MS.SQLSVR.v10.en/s10sq_GetStart/html/c10eeaa5-3d3c-49b4-a4bd-5dc4fb190142.htm I nawet jeśli byłeś; t przestarzałe lewy i prawy Wersje nie powinny być używane, ponieważ dają niespójne, a czasami niedokładne wyniki. Czasami można je interpretować jako łączenie krzyżowe zamiast łączenia lewych lub prawych. – HLGEM

6

Niektórzy ludzie uważają następującą składnię alternatywa łatwiej zobaczyć, co się dzieje:

select t1.value,t2.value 
from MyTable t1 
    inner join MyTable t2 on 
     t1.id = t2.id 
where t1.id = @id 
28

Możesz dołączyć tabelę do siebie tyle razy, ile jest potrzebna, to nazywa się self join.

jest alias przypisany do każdego przypadku stołu (jak w przykładzie poniżej), aby odróżnić jedno od drugiego.

SELECT a.SelfJoinTableID 
FROM dbo.SelfJoinTable a 
     INNER JOIN dbo.SelfJoinTable b 
     ON a.SelfJoinTableID = b.SelfJoinTableID 
     INNER JOIN dbo.SelfJoinTable c 
     ON a.SelfJoinTableID = c.SelfJoinTableID 
WHERE a.Status = 'Status to filter a' 
     AND b.Status = 'Status to filter b' 
     AND c.Status = 'Status to filter c' 
+6

Dobre dla ciebie za wspomnieć, że trzeba aliasu – HLGEM

+16

naprawdę nie tyle razy jak wymagają .. istnieje limit o przedstawieniu 256 tabel w zapytaniu:] – pkmiec

+0

@pkmiec jako intrygujące, jak się wydaje, [Microsoft docs o ograniczeniach SQL Server] (https://docs.microsoft.com/en-us/sql/sql-server/maximum-capacity-specifications-for-sql-server) różnią się od twojego argumentu - 'Tabele na instrukcję SELECT - Ograniczone tylko przez dostępne zasoby'. Nadal nie jestem pewien, czy kiedykolwiek wykorzystam te informacje, chyba że zaprojektuję coś naprawdę strasznego, ale chciałabym wiedzieć, jak zdobyłaś tę liczbę, na pewno wygląda intrygująco. –

1
SELECT * FROM A AS b INNER JOIN A AS c ON b.a = c.a 
WHERE b.a = 'some column value' 
2

SELECT COUNT(*) FROM (SELECT * FROM tbl WHERE id=1 UNION SELECT * FROM tbl WHERE id=2) a

Jeśli masz dwa rzędy one różne, jeśli jeden - to samo.