2013-02-26 10 views
10

Jestem przekonany, że to jest coś prostego, ale każdy przykład, który próbowałem, zawodzi. Chcę kwerendy tabelę jak taWybierz wiersze z pasującymi kolumnami z SQL Server

ID Part_Type Station_Type 
--- --------- ------------ 
1 5   234 
2 5   846 
3 5   234 
4 6   585 
5 6   585 
6 7   465 

i powrotu wiersze 1 i 3 oraz 4 i 5. Oznacza to, że chcę wrócić wiersze, gdzie dwa z ich kolumn meczu. Jest podobne do tego pytania: SO Question, ale musi być wykonane tylko na jednym stole. To zapytanie znajdzie dopasowanie dla każdego wiersza, ale chcę tylko wierszy, które mają pasujące wartości w dwóch kolumnach. Jak mam to znaleźć?

Dziękuję

+0

Co powinien ha ppen, jeśli trzy wiersze mają takie same parametry Part_Type i Station_Type? – hatchet

+0

Powinno zwrócić wszystkie trzy. Zasadniczo szukam, aby zwrócić "grupy" wierszy, z których każdy ma pasujące kolumny. – user912447

Odpowiedz

14

można użyć następujących:

select t1.id, t1.part_type, t1.station_type 
from yourtable t1 
where exists (select part_type, station_type 
       from yourtable t2 
       where t1.part_type = t2.part_type 
       and t1.station_type = t2.station_type 
       group by part_type, station_type 
       having count(id) > 1) 

Zobacz SQL Fiddle with Demo

+1

W zależności od wymagań sugerowałbym zastąpienie 'mającego (id) = 2'' liczeniem (id)> 1' Coś w tym stylu: http://www.sqlfiddle.com/#!3/48af7/ 6 –

+1

@Zespri masz prawdopodobnie rację, aktualizacja. dzięki :) – Taryn

1

myślę, że self-join będzie pracować dla Ciebie:

SELECT * FROM table t1 
INNER JOIN table t2 ON t1.Part_Type = t2.Part_Type 
    AND t1.Station_Type = t2.Station_Type 
    AND t1.Id <> t2.Id 
+2

potrzebujesz czegoś, aby uniknąć duplikatów. Jak napisano, każdy wiersz zawsze będzie się pasował. – hatchet

+0

Ups, masz rację, nie przemyślałeś. Zaktualizowałem moją odpowiedź i przegłosowałem twoją. –

3
select id, part_type, station_type 
from myTable t1 
where exists (select 1 from myTable t2 
       where t1.part_type = t2.part_type 
        and t1.station_type = t2.station_type 
        and t1.id <> t2.id) 
+0

Obydwa twoje odpowiedzi bluefeeta działają i jedynym powodem, dla którego akceptuję jego jest "grupa przez", którą umieścił. Dzięki temu informacja jest trochę łatwiejsza do odczytania. – user912447

Powiązane problemy