Domanda

Ciao non capisco questa semplice query SQL con JOIN. Voglio selezionare il prodotto con due attributi. Ecco le tabelle (prodotto e quindi gli attributi):

Product table

Attribute table

E qui vanno due domande

Prima query esegui solo un join con 4 e gli operatori e non restituire dati (ma dovrebbe).

Seconda query Do Due Join con il prodotto tabelle <--> attrv_1 e prodotto <--> attrv_2 e funziona molto bene. :

Ecco la prima domanda

SELECT * 
FROM tblProducts p 
INNER JOIN tblAttributesValues attrv ON p.productid = attrv.productid
                    AND attrv.atrid = 1
                    AND attrv.atrvalue like '%JANICKA IWONA%' 
                    AND attrv.atrid = 2
                    AND attrv.atrvalue like '%N.ERA%' 

e seconda query che restituiscono dati corretti:

SELECT p.* 
FROM tblProducts p 
INNER JOIN tblAttributesValues attrv_1 ON p.productid = attrv_1.productid
                    AND attrv_1.atrid = 1
                    AND attrv_1.atrvalue LIKE '%JANICKA IWONA%'
INNER JOIN tblAttributesValues attrv_2 ON p.ProductID = attrv_2.ProductId
                    AND attrv_2.atrid = 2
                    AND attrv_2.atrvalue LIKE '%N.ERA%'   

Nella seconda query SQL mi sono unito due volte per trovare il prodotto con due attributi.

Perché la prima query non si applica e l'operatore con un join?

Ecco l'output:

Second query output

È stato utile?

Soluzione

"Perché la prima query non si applica e l'operatore con un join?"

Perché non ci sono righe nella tabella degli attributi che potrebbero avere atrid = 1 e atrid = 2 contemporaneamente.

Potevo pensare a una soluzione che potesse usare il gruppo, avendo e contare clausole per ottenere risultati desiderati, ma la tua seconda query sarebbe molto probabilmente più veloce e più semplice da capire.

Altri suggerimenti

La tua prima domanda non può mai restituire alcun risultato. Quello che gli stai chiedendo di fare è ottenere ogni prodotto per il quale la tabella degli attributi ha una voce in cui il campo atrvalue è uguale a 1 e il campo atrvalue è uguale a 2. poiché deve essere uno degli altri, questo significa Il lato destro del tuo join non avrà mai voci, e poiché questo è un join interno sul lato sinistro non sarà mai abbinato, quindi nessuna riga. Quello che vuoi effettivamente è un o tra i tuoi due set di condizioni:

SELECT * from tblProducts p join tblAttributesValues attrv ON p.productid = attrv.productid AND (attrv.atrid = 1 AND attrv.atrvalue like '%JANICKA IWONA%') OR (attrv.atrid = 2 AND attrv.atrvalue like '%N.ERA%')

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top