Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

query con left JOIN?

  1. #1
    fabietto10 non è in linea Scolaretto
    Post
    102
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao a tutti avrei bisogno di un aiuto per creare una query che estrapoli dati una struttura cosi fatta

    TABELLA PRODOTTI
    id_prodotto
    nome
    ...

    TABELLA INGREDIENTI
    id_ingrediente
    nome
    .....

    TABELLA SC_PR_IN
    id_sc
    id_prodotto
    id_ingrediente

    nell'ultima tabella chiaramente memorizzo per ogni prodotto gli ingrediente di cui è composto.
    Avrei bisogno di creare una query che mi estrapoli tutti i prodotti che NON hanno determinati ingredienti nella loro composizione.
    Ad esempio "mostrami tutti i prodotti che non hanno soia o olio nella loro composizione"
    per quello che ho letto in giro credo di dover usare il LEFT JOIN ma non riesco a trovare degli esempi che mi possano aiutare a risolvere il problema.
    Grazie in anticipo.

  2. #2
    Post
    1,833
    Like Inviati  
    0
    Like Ricevuti  
    6
    Quote Originariamente inviato da fabietto10 Visualizza il messaggio
    ...Avrei bisogno di creare una query che mi estrapoli tutti i prodotti che NON hanno determinati ingredienti nella loro composizione.
    Ad esempio "mostrami tutti i prodotti che non hanno soia o olio nella loro composizione"
    per quello che ho letto in giro credo di dover usare il LEFT JOIN ma non riesco a trovare degli esempi che mi possano aiutare a risolvere il problema...
    Prova qui Confrontare due tabelle e trovare record senza corrispondenze - Access. Occhio anche all'uso di [NOT IN] e [NOT EXISTS] (non ho trovato però alcun confronto con l'uso delle diverse sintassi specifico per Access, solo per SqlServer, qui NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server | EXPLAIN EXTENDED. Alcuni concetti "generali" credo che possano comunque valere, ovviamente non per quanto riguarda le prestazioni, specifiche per SqlServer). Che, vista l'apertura di occhi da parte di +m+, non c'entra assolutamente niente. Verrà buono per la prossima volta.
    Ultima modifica di Phil_cattivocarattere; 12-09-2014 12:42 

  3. #3
    L'avatar di +m+
    +m+
    +m+ non è in linea Scribacchino
    Post
    922
    Like Inviati  
    0
    Like Ricevuti  
    0
    Direi che LEFT JOIN non c'entra un granchè (anzi direi quasi niente).
    E' una semplice selezione

  4. #4
    Post
    1,833
    Like Inviati  
    0
    Like Ricevuti  
    6
    Quote Originariamente inviato da +m+ Visualizza il messaggio
    ...E' una semplice selezione
    Ovvio! Chi è stato quel che ha scritto
    Quote Originariamente inviato da Phil_cattivocarattere Visualizza il messaggio
    Prova qui Confrontare due tabelle e trovare record senza corrispondenze - Access. Occhio anche all'uso di [NOT IN] e [NOT EXISTS] (non ho trovato però alcun confronto con l'uso delle diverse sintassi specifico per Access, solo per SqlServer, qui NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server | EXPLAIN EXTENDED. Alcuni concetti "generali" credo che possano comunque valere, ovviamente non per quanto riguarda le prestazioni, specifiche per SqlServer).
    ... qualcuno lo fermi.

  5. #5
    fabietto10 non è in linea Scolaretto
    Post
    102
    Like Inviati  
    0
    Like Ricevuti  
    0
    Il problema è che quando faccio una query di SELECT e nella clausola where metto ad esempio NOT(id_ingrediente=12 or i_ingrediente=13) continuo a vedere il prodotto se ha uno o più ingredienti oltre quelli che ho escluso.
    faccio un esempio più chiaro se il prodotto salsa1 è fatto da omodoro, sale, olio, basilico; quando faccio una select sulle due tabelle che mi escluda tutti i prodotti che non hanno olio e sale, salsa1 continua a vedersi perchè ha pomodoro e basilico.

  6. #6
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Post
    16,804
    Like Inviati  
    0
    Like Ricevuti  
    23
    Magari leggendo la guida per come si usano le Clausole...
    SELCT * FROM T1
    WHERE Id_Ingrediente NOT IN (12,13)
    
    ℹ️ Leggi di più su @Alex ...

  7. #7
    fabietto10 non è in linea Scolaretto
    Post
    102
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ragazzi scusate ma forse mi sono espresso male.
    se eseguo la query
    SELECT scambio.id_prodotto, scambio.id_ingrediente
    FROM scambio
    WHERE (((scambio.id_ingrediente) Not In (2,6))
    
    non fa altro che escludermi gli ingredienti dentro la clausola NOT IN ma continuo a vedere l'id prodotto con gli altri ingredienti di cui è composto.

    il mio obiettivo è trovare prodotti che NON contengono determinati ingredienti (facciamo finta che sono diabetico e dalla tabella di scambio prodotti-ingredienti devo trovare tutti i prodotti che non hanno zucchero tra gli ingredienti).

  8. #8
    L'avatar di +m+
    +m+
    +m+ non è in linea Scribacchino
    Post
    922
    Like Inviati  
    0
    Like Ricevuti  
    0
    Se non ho capito male questo è quello che vuoi.

    select * from prodotti where id_prodotto not in 
    (
      select distinct(prodotti.id_prodotto) from prodotti,ingredienti,sc_pr_in where 
      (prodotti.id_prodotto=sc_pr_in.id_prodotto) -- qui puoi mettere i join che vuoi sono pigro e faccio così
      and 
      (ingredienti.id_ingrediente=sc_pr_in.id_ingrediente) 
      and 
        ((ingredienti.nome="soia" ) or  (ingredienti.nome="olio" ))
    )
    
    Questa è una query per mysql versione 5.6 o (meglio) mariadb >5.5 con le sottoquery materializzate.
    Con Access potrebbe non essere un piano ottimale, ma se le cardinalità son piccole non vedo particolari problemi.
    E' uno strumento che non utilizzo quindi non so dare consigli più precisi.

    Attenzione alle parentesi che sono particolarmente importanti giacchè ci sono AND e OR (precedenze)

    Volendo potresti anche fare la formula equivalente con De Morgan, ma personalmente dubito ne valga la pena.
    Ultima modifica di +m+; 12-09-2014 15:26  Motivo: formattazione migliore

  9. #9
    OsvaldoLaviosa ora è in linea Topo di biblioteca
    Post
    3,091
    Like Inviati  
    0
    Like Ricevuti  
    1
    Nella query devi includere sicuramente i campi Prodotti.IDProdotto e Prodotti.Nome + Ingredienti.Nome.
    I join possono essere quelli normali (INNER).
    In visualizzazione struttura query, al rigo Criterio, in corrispondenza del campo Ingredienti.Nome devi scrivere così:
    Not Like "soia" Or Not Like "olio"

  10. #10
    Post
    1,833
    Like Inviati  
    0
    Like Ricevuti  
    6
    Quote Originariamente inviato da Phil_cattivocarattere Visualizza il messaggio
    Ovvio! Chi è stato quel che ha scritto
    Quote Originariamente inviato da Phil_cattivocarattere Visualizza il messaggio
    Prova qui Confrontare due tabelle e trovare record senza corrispondenze - Access. Occhio anche all'uso di [NOT IN] e [NOT EXISTS] (non ho trovato però alcun confronto con l'uso delle diverse sintassi specifico per Access, solo per SqlServer, qui NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server | EXPLAIN EXTENDED. Alcuni concetti "generali" credo che possano comunque valere, ovviamente non per quanto riguarda le prestazioni, specifiche per SqlServer). Che, vista l'apertura di occhi da parte di +m+, non c'entra assolutamente niente.
    ... qualcuno lo fermi.
    Non era poi così quello che ha scritto.
    Accodandomi al suggerimento di +m+ (di cui però ho capito solo la parte strettamente SQL, il resto per me è materia sconosciuta), ti illustro il ragionamento da seguire, non sono ancora riuscito a metterlo in pratica al tuo caso concreto.
    Procedi per passi, dopo li "unirai" il più possibile all'interno della stessa query.
    1 = seleziona gli id_prodotti dalla tabella SC_PR_IN dove id_ingrediente è "olio" o "sale"
    2 = seleziona gli id_prodotti dalla tabella TABELLA PRODOTTI che non hanno corrispondenza nella selezione di cui al punto 1. STOP
    Man mano che scrivo non sembra così complicato. Ecco l'equivalente in query
    1 =
    SELECT DISTINCT id_prodotto FROM sc_pr_in WHERE id_ingrediente in (12, 13, ... e tutti gli altri codici ingrediente che cercando)
    
    2 =
    SELECT * FROM [tabella prodotti] WHERE [tabella prodotti].[id_prodotto] NOT IN (SELECT DISTINCT id_prodotto FROM sc_pr_in WHERE id_ingrediente IN (12, 13))
    
    (grrrrr... tabelle con il nome con lo spazio)

    Mi sono imbattuto in queste situazioni in un paio di forum proprio in questi giorni e sono giunto alla conclusione che vanno trattate "per differenza" (si cerca prima quello che corrisponde ai criteri che si vogliono escludere e si cercano poi per differenza quelli che restano).
    E per fare questa differenza c'è anche la strada del LEFT JOIN, sì.
    2 =
    SELECT * FROM [tabella prodotti] AS T_left LEFT JOIN (SELECT DISTINCT id_prodotto FROM sc_pr_in WHERE id_ingrediente IN (12, 13)) AS T_right ON T_left.id_prodotto = T_right.id_prodotto WHERE T_right.id_prodotto IS NULL
    
    e per valutare quale delle due soddifa esattamente le tue esigenze posso solo rinviarti al sito già suggerito: NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server | EXPLAIN EXTENDED con le precisazioni già scritte all'inizio del thread

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Risposte: 2
    Ultimo Post: 12-06-2019, 17:59
  2. Query con left join multipli
    Da hayabusa_65 nel forum Microsoft Access
    Risposte: 1
    Ultimo Post: 12-03-2016, 09:10
  3. Risposte: 15
    Ultimo Post: 19-07-2015, 14:04
  4. Risolto: Eliminare record dopo una Query Left join
    Da sistemista nel forum Visual Basic .Net
    Risposte: 15
    Ultimo Post: 29-12-2011, 10:09
  5. Left join
    Da sly185 nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 19-11-2004, 14:30