Query con filtro dei dati

venerdì 26 ottobre 2012 - 18.30
Tag Elenco Tags  SQL Server 2008 R2

voyager18 Profilo | Junior Member

Ciao a tutti! Ho una tabella di questo genere

ID-----Cod-----IdA----IdB
10-----123-----7------7
11-----123-----8------7
14-----123-----10-----8
15-----123-----7------8
16-----123-----7------9
17-----123-----11-----9
18-----123-----7------10
19-----123-----12-----10

Da questa tabella devo selezionare le righe che hanno in IdA i valori 7 e 8 ma che hanno anche lo stesso valore in IdB. Il valore di IdB non lo conosco a priori quindi non posso mettere una clausola WHERE IdB=7.

Facendo una query così
SELECT * FROM tab1 WHERE IdA=7 OR IdA = 8
mi restituisce anche le righe con ID 15, 16 e 18 mentre io sono interessato solo alle righe con ID 10 e 11 ovvero alle righe che hanno entrambi i valori di IdA che ho specificato nella WHERE e hanno entrambe lo stesso valore di IdB. C'è un modo per filtrare i dati in questo modo?
Grazie!!

DomA Profilo | Expert

Ciao,
sinceramente non ho capito bene
Procediamo con ordine:
>>sono interessato solo alle righe con ID 10 e 11 ovvero alle righe che hanno entrambi i valori di IdA che ho specificato nella WHERE e hanno entrambe lo stesso valore di IdB

la seguente riga ha valori diversi in IdA e IDdB:

ID-----Cod-----IdA----IdB
11-----123-----8------7

cerca di essere più chiaro.

-----------------------------------------------------------------------------------


Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.

http://www.infomidia.it

Domenico

voyager18 Profilo | Junior Member

In pratica quello che mi serve è selezionare le righe che hanno lo stesso IdB (di cui non conosco a priori il valore) e che soddisfano i criteri di filtro che io passo alla query (valori di IdA che conosco ad esempio IdA = 7 e IdA = 8).

Per esempio: se faccio la query SELECT * FROM tab1 WHERE IdA=7 OR IdA = 8 mi restituisce 5 righe della tabella ovvero la prima riga, la seconda, la quarta, la quinta e la settima. Però a me serve che mi restituisca solo le prime due righe perchè sono le uniche che soddisfano ai due criteri WHERE della query e che hanno lo stesso valore nel campo IdB.

renarig Profilo | Expert

Se ho "interpretato" bene la domanda tu vuoi
trovare tutti e solo i record che:
___ 1°) _____
Al campo IdA hanno valore 7 oppure 8 ( come da criterio )
___ 2°) _____
Al campo IdB hanno dei valori uguali ( intesi sulla verticale )
quindi tu non conosci a priori il criterio da porre a IdB
ma puoi solo dire che il Count di IdB deve essere maggiore di 1

____________________________________________________________________


Quindi se ho interpretato bene data la tabella "tab1"
con i campi:
___ ID ___ Numerico
___ Cod ___ Numerico
___ IdA ___ Numerico
___ IdB ___ Numerico


Io vedo 2 possibilita di risolvere ( lascio a te la scelta )


_____________________________________________________________________
_____________________________________________________________________
_____________________________________________________________________






__ 1° possibilita ___ 2 query nidificate l'una nell'altra ( Non Editabile )
SELECT tab1.ID, tab1.Cod, tab1.IdA, tab1.IdB FROM tab1 INNER JOIN ( SELECT tab1.IdB FROM tab1 GROUP BY tab1.IdB, IIf([IdA]=7,"Vi") & IIf([IdA]=8,"Vi") HAVING ( (( IIf([IdA]=7,"Vi") & IIf([IdA]=8,"Vi") ) Is Not Null) AND ((Count(tab1.IdB))>1) ) ) AS S01 ON tab1.IdB = S01.IdB WHERE (( (tab1.IdA)=7 Or (tab1.IdA)=8 )) ;





__ 2° possibilita ___ non nidifichi niente ma usi la clausola "In" ( Editabile )

( concettualmente è la più difficile ma "voci di popolo" dicono sia la più veloce )
SELECT tab1.ID, tab1.Cod, tab1.IdA, tab1.IdB FROM tab1 WHERE ( ((tab1.IdA)=7 Or (tab1.IdA)=8) AND ( (tab1.IdB) In ( SELECT tab1.IdB FROM tab1 GROUP BY tab1.IdB, IIf([IdA]=7,"Vi") & IIf([IdA]=8,"Vi") HAVING ( (( IIf([IdA]=7,"Vi") & IIf([IdA]=8,"Vi") ) Is Not Null) AND ((Count(tab1.IdB))>1) ) ) ) ) ;



Facci sapere


.

renarig Profilo | Expert

Mmmm!! forse ho sbagliato tutto


Ero convinto si trattasse di Access ma ora mi chiedo
dove io abbia letto ciò ????



.

voyager18 Profilo | Junior Member

No, infatti non è access, è sql server 2008.

renarig Profilo | Expert

la traduciamo in SQLServer2008
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Facci sapere


.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5