2012-04-04 15 views
25

Ich habe eine Tabelle, die mehrere Zeilen mit den folgenden Feldern hat:SQL-Anweisung mit Where-Klausel mit mehreren Werten

PersonName SongName Status 

Ich möchte von einem Mehrfachauswahl-Listenfeld ausgewählt Namen verwenden, die ich die Werte abrufen können, und dann eine where-Klausel, damit die Song-Namen angezeigt werden, die alle ausgewählten Personen spielen können. Daher ist der Status abgeschlossen.

Zum Beispiel:

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

Wenn ich wählen Holly und Ryan aus dem Listenfeld und drücken Sie die Taste, um die Abfrage nur Highland zeigen sollte, wie das ist, was sie beide wissen.

+0

Wenn 'Ryan' nicht über' Complete' als Status, sollte das Ergebnis 'Highland'? –

+0

WÄHLEN [SongName] FROM [Lernen] WHERE ([BandieName] LIKE '%' + '"& Element.Text &' '+'% ') UND ([BandieName] LIKE'% '+'" & Element.Text & "'+'% ') AND ([Status] LIKE' Complete ') – Sophie

Antwort

48

Versuchen:

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

Die Zahl in der having sollte die Menge der Menschen entsprechen. Wenn Sie auch den Status benötigen Complete Verwendung diese where Klausel anstelle der vorherigen zu sein:

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

Das bringt keine Ergebnisse, das ist ähnlich dem, mit dem ich vorher gearbeitet habe, wenn du es benutzt hast oder wie 'Holly' UND 'RYAN 'Dann bringt es keine Ergebnisse, wenn Sie OR anstelle von AND verwenden, werden alle diese Songs erscheinen, die sowohl für Holly als auch für Ryan einen vollständigen Status haben, nicht nur für diejenigen, die sowohl Holly als auch Ryan komplett haben. danke – Sophie

+1

Das ist nicht möglich, wie Sie sehen können, liefert das erwartete Ergebnis [http://sqlfiddle.com/#!2/e1783/2] mit den gleichen Daten, die Sie angegeben haben. –

+0

so lief diese Abfrage und lieferte Ihnen das erwartete Ergebnis, daher lief es richtig? – Sophie

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

Wenn Sie parametrisierte gespeicherte Prozeduren verwenden:

  1. Pass in Komma getrennte Zeichenfolge
  2. Verwenden Sie spezielle Funktion Komma String in Tabellenwert Variable
  3. Verwenden INNER JOIN ON t.PersonName = newTable.PersonName mit Hilfe einer Tabelle Variable aufgeteilt getrennt die enthält Namen
+0

Name sollte ein Alias ​​der Spalte PersonName sein. –

+0

@aF. Sie können sehen, warum Sie verwirrt sind - die Beispieldaten zeigen verschiedene Spaltennamen zu den zuvor genannten Definitionen! – Bridge

+0

@Bridge die Frage wurde editiert 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') 
diese
+0

Sie sind beide in der gleichen Tabelle? – Sophie

+0

@Sophie Ja, das ist ein Self-Join. –

+0

meine Tabelle heißt Lernen was wäre das Äquivalent für T1 und T2? – Sophie