2012-04-04 20 views
25

Ho una tabella che ha più righe con i seguenti campi:istruzione SQL utilizzando clausola Where con più valori

PersonName SongName Status 

voglio usare nomi selezionati da una casella di riepilogo selezione multipla, che posso recuperare i valori, e poi fai una clausola where in modo che mostri i nomi delle canzoni che possono essere riprodotte dalle persone selezionate, quindi lo stato è completo.

Ad esempio:

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

Se seleziono agrifoglio e Ryan dalla casella di riepilogo e premere il pulsante la query deve solo mostrare Highland come è quello che entrambi sanno.

+0

Se 'Ryan' non hai' complete' come lo stato, il risultato dovrebbe essere 'Highland'? –

+0

SELECT [SongName] FROM [Learning] WHERE ([BandieName] LIKE '%' + '"& item.Text &"' + '%') AND ([BandieName] LIKE '%' + '"& item.Text & "'+'% ') AND ([Stato] LIKE' Completa ') – Sophie

risposta

48

Prova questa:

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

sul numero di dover dovrebbe corrispondere alla quantità di persone. Se hai bisogno anche lo stato di essere Complete uso questo where clausola al posto del precedente:

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

Questo non porta alcun risultato, questo è simile a quello con cui stavo lavorando in precedenza, se hai usato o come 'holly' AND 'RYAN 'quindi non porta risultati, se usi OR invece di AND, farai apparire tutte quelle canzoni che hanno uno stato di completezza sia per holly che per ryan, non solo per quelle per cui sia Holly che Ryan hanno entrambi completato. grazie – Sophie

+1

Questo non è possibile, come puoi vedere fornisce il risultato previsto [qui] (http://sqlfiddle.com/#!2/e1783/2) con gli stessi dati che hai fornito. –

+0

quindi questa query è stata eseguita e ti ha fornito il risultato previsto, pertanto è stato eseguito correttamente? – Sophie

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

Se si utilizza stored procedure parametrizzata:

  1. Pass separati da virgola stringa
  2. Utilizzare la funzione speciale per dividere separati da virgola stringa in valore tabella delle variabili
  3. Usa INNER JOIN ON t.PersonName = newTable.PersonName utilizzando una variabile di tabella che contiene passato nei nomi
+0

nome deve essere un alias della colonna NomeDuomo. –

+0

@aF. Puoi capire perché verrai confuso: i dati di esempio mostrano nomi di colonne diversi rispetto alle definizioni menzionate in precedenza! – Bridge

+0

@Bridge la domanda è stata editata 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

Sono entrambi nello stesso tavolo? – Sophie

+0

@Sophie Sì, questo è un self-join. –

+0

la mia tabella si chiama Learning quale sarebbe l'equivalente per t1 e t2? – Sophie