Newsgroup: it.comp.software.database
Titolo: Aiuto su query

Scusate ma ho un problemino con una query,
spero di non essere OT e che qualcuno mi aiuti
ho una tabella con alcuni campi numerici
vorrei una query che mi ritorni tutte le righe
nelle quali esattamente 2 campi (non importa quali)
abbiano un certo valore
ES: voglio le righe che hanno du e campi col 3
X Y Z
1  2  3
2  3  1
3  3  2 <-----mi ritorna questa e nessuna delle altre
3  3  3


Eccoti due soluzioni possibili:
select * from provanum;
+------+------+------+
| X    | Y    | Z    |
+------+------+------+
|    1 |    2 |    3 |
|    2 |    3 |    1 |
|    3 |    3 |    2 |
|    3 |    3 |    3 |
|    2 |    3 |    3 |
|    3 |    2 |    3 |
+------+------+------+
(MySQL)
select * from provanum
where  concat_ws("-", X, Y, Z)
	regexp "(3-3-[^3])|([^3]-3-3)|(3-[^3]-3)";
(ANSI SQL)
select * from provanum
where X || "-" || Y || "-" || Z
        SIMILAR TO "(3-3-[^3])|([^3]-3-3)|(3-[^3]-3)";
        -- non tutti i DBMS lo supportano !
+------+------+------+
| X    | Y    | Z    |
+------+------+------+
|    3 |    3 |    2 |
|    2 |    3 |    3 |
|    3 |    2 |    3 |
+------+------+------+
Oppure, c'e' la classica UNION, che va bene ovunque:
select * from provanum where  X = 3 and Y = 3  and Z != 3
UNION
select * from provanum where  X = 3 and Y != 3 and Z = 3
UNION
select * from provanum where  X != 3 and Y = 3 and Z = 3;
+------+------+------+
| X    | Y    | Z    |
+------+------+------+
|    3 |    3 |    2 |
|    3 |    2 |    3 |
|    2 |    3 |    3 |
+------+------+------+
Ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

 ha scritto nel messaggio
news:e5TDc.23048$GQ3.6...@twister2.libero.it...

Ciao, a me sembra che basta una semplice Where
-----------------
Select *
FROM Tabella
WHERE (X=3 AND Y=3) OR
              (X=3 AND Z=3)  OR
              (Y=3 AND Z=3)
-----------------
Ciao Giorgio

 ha scritto nel
messaggio news:cbp3l4$a4h$1...@lacerta.tiscalinet.it...



Occorre aggiungere una condizione per dire che solo due delle colonne 
contengono il valore voluto. Questa query restituirebbe anche quelle 
righe in cui tutte e tre le colonne hanno il valore cercato.
  WHERE (X=3 AND Y=3 AND Z != 3) OR
        (X=3 AND Y =! 3 AND Z=3) OR
        (X != 3 AND Y=3 AND Z=3)
Inoltre, Questa query e' raccomandabile solo se nessuno dei campi e' 
indicizzato. Se i campi sono indicizzati, una UNION e' spesso piu' 
veloce (dipende dal DBMS).


 Parecchie..... speravo in qualcosa di + semplice
Sono 10
Ciao Giorgio

 
[SNIP]
In effetti, un problema in cui il dato cercato prescinde dalle colonne 
che lo contengono non sembra adeguato a una soluzione relazionale.
Forse dovresti rivedere la tua struttura dati e distribuire le 
informazioni in maniera migliore.
In questa tua ricerca io vedo un *possibile* peccato di mancata 
normalizzazione.
i tuoi dati dovrebbero essere ricostruiti cosi':
tabella originale:
PK   X   Y   X
1    2   3   3
2    3   2   2
3    3   3   3
4    3   3   1
e cosi' via
tabella trasformata
FK  tipo valore
1   X    2
1   Y    3
1   Z    3
2   X    3
2   Y    2
2   Z    2
3   X    3
3   Y    3
3   Z    3
4   X    3
4   Y    3
4   Z    1
Query:
select FK, count(*) as valori
from trasformata where valore = 3
group by FK
having valori = 2;
+------+--------+
| FK   | valori |
+------+--------+
|    1 |      2 |
|    4 |      2 |
+------+--------+
Con questo criterio puoi avere quanti tipi vuoi (invece di tante 
colonne) e puoi cercare molto meglio e piu' facilmente.



se i campi sono indicizzati e le righe sono molte sì, se le righe sono poche
non conviene usare gli indici e le Union.
In ogni caso entrambe le soluzioni hanno la stessa logica e le stesse
combinazioni e sembra sia questo a preoccupare Mau, forse gli conviene
valutare se normalizzare la tabella come da te suggerito. :-)
Ciao Giorgio


per curiosità ho provato con Sql Server a creare la tabella e a indicizzare
i campi, il piano di esecuzione della query
--------------------
Select *
FROM Tabella
WHERE (C1=3 AND C2=3) OR
      (C1=3 AND C3=3) OR
      (C2=3 AND C3=3)
-------------------
indica l'utilizzo dell'indice. *---Index Scan(OBJECT: ecc ecc*
Ciao Giorgio