2012-04-04 12 views
25

Mam tabeli, który ma wiele wierszy z następujących dziedzin:SQL komunikat za pomocą klauzuli Where z wielu wartości

PersonName SongName Status 

chcę używać nazw wybranych z wielokrotnego listbox wyboru, które można pobrać wartości, a następnie wykonaj klauzulę where, aby wyświetlała nazwy piosenek, które wszyscy wybrani mogą odtworzyć, dlatego status został zakończony.

Na przykład:

PersonName  SongName Status 
Holly   Highland Complete 
Holly   Mech  Complete 
Ryan   Highland Complete 

Jeśli wybiorę Holly i Ryana z listy i naciśnij przycisk kwerenda powinien po prostu pokazać Highland jak to, co oboje wiemy.

+0

jeśli 'Ryan' nie posiada' Complete' jak status, powinno być wynikiem 'Highland'? –

+0

SELECT [Nazwa utworu] OD [Nauka] GDZIE ([BandieName] LIKE '%' + '"& pozycja.Tekst i"' + '%') ORAZ ([BandieName] LIKE '%' + '"& item.Text & "'+'% ') AND ([Status] LIKE' Complete ') – Sophie

Odpowiedz

48

Spróbuj tego:

select songName from t 
where personName in ('Ryan', 'Holly') 
group by songName 
having count(distinct personName) = 2 

numer w konieczności powinna odpowiadać ilości ludzi. Jeśli potrzebujesz także statusu być Complete użycie tego where klauzula zamiast poprzedniego:

where personName in ('Ryan', 'Holly') and status = 'Complete' 
+0

Nie przynosi to żadnych rezultatów, jest to podobne do tego, z czym pracowałem wcześniej, jeśli używałeś lub lubisz "ostrokrzew" AND 'RYAN "wtedy nie przynosi żadnych rezultatów, jeśli użyjesz OR zamiast AND, wywoła wszystkie utwory, które mają status kompletny zarówno dla świętego, jak i ryana, nie tylko te, które zarówno holly, jak i ryan są kompletne. dzięki – Sophie

+1

nie jest to możliwe, jak widać to stanowi rezultat oczekiwany [tutaj] (http://sqlfiddle.com/#!2/e1783/2) z tymi samymi danymi, który podałeś. –

+0

, więc to zapytanie zostało uruchomione i dostarczyło oczekiwany wynik, dlatego działało poprawnie? – Sophie

6
SELECT PersonName, songName, status 
FROM table 
WHERE name IN ('Holly', 'Ryan') 

Jeśli używasz parametryzowane procedury przechowywanej:

  1. Pass w oddzielonych przecinkami ciąg
  2. Zastosowanie specjalnej funkcji podzielić oddzielonych przecinkami ciąg do wartości tabeli zmiennej
  3. Zastosowanie INNER JOIN ON t.PersonName = newTable.PersonName użyciu zmiennej tabeli która zawiera nazwy przekazane
+0

nazwa powinna być aliasem kolumny PersonName. –

+0

@aF. Możesz zobaczyć, dlaczego byłbyś zdezorientowany - przykładowe dane pokazują różne nazwy kolumn do wcześniej wspomnianych definicji! – Bridge

+0

@Bridge pytanie zostało zmienione oO –

0
Select t1.SongName 
From tablename t1 
left join tablename t2 
on t1.SongName = t2.SongName 
    and t1.PersonName <> t2.PersonName 
    and t1.Status = 'Complete' -- my assumption that this is necessary 
    and t2.Status = 'Complete' -- my assumption that this is necessary 
    and t1.PersonName IN ('Holly', 'Ryan') 
    and t2.PersonName IN ('Holly', 'Ryan') 
+0

Obaj są w tym samym stole? – Sophie

+0

@Sophie Tak, to jest samołączenie. –

+0

mój stół nazywa się uczeniem się, co by równoważne było dla t1 i t2? – Sophie

Powiązane problemy