Node JS MSSQL Query in più tabelle

di il
8 risposte

Node JS MSSQL Query in più tabelle

Salve a tutti io eseguo un query in una tabella

const result =
await sql.query`SELECT Codice,RagioneSociale,TEL1,TEL2,TELCASA1,CELL1,FAX1,EMAIL1 FROM Connector.AnagraficaConnector WHERE TEL1 LIKE '%' + 	${phoneNumber} + '%'
OR TEL2 LIKE '%' + ${phoneNumber} + '%'
OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
OR CELL1 LIKE '%' + ${phoneNumber} + '%'       
OR FAX1 LIKE '%' + ${phoneNumber} + '%' `;

Ci sono dei casi dove se result non produce risultati

Quindi

if(result.recordset.length < 1)

Allora eseguo

const result = await sql.query`SELECT Codice,RagioneSociale,Referente,Ruolo,TEL1,TEL2,TELCASA1,CELL1,FAX1,EMAIL1 FROM Connector.ReferenteConnector 	WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
OR TEL2 LIKE '%' + ${phoneNumber} + '%'
OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
OR CELL1 LIKE '%' + ${phoneNumber} + '%'       
OR FAX1 LIKE '%' + ${phoneNumber} + '%' `;

Se io volessi unificare la query dovrei ?

const result = await sql.query`SELECT * FROM Connector.AnagraficaConnector,Connector.ReferenteConnector WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
 OR TEL2 LIKE '%' + ${phoneNumber} + '%'
OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
OR CELL1 LIKE '%' + ${phoneNumber} + '%'       
OR FAX1 LIKE '%' + ${phoneNumber} + '%' `;

Ovviamente SELECT * perchè contengono colonne diverse

Se io invece volessi aggiungere i dati della seconda Query alla pima dovrei usare JSON.stringify()?

Quindi esempio ?

const query =
await sql.query`SELECT Codice,RagioneSociale,TEL1,TEL2,TELCASA1,CELL1,FAX1,EMAIL1 FROM Connector.AnagraficaConnector WHERE TEL1 LIKE '%' + 	${phoneNumber} + '%'
OR TEL2 LIKE '%' + ${phoneNumber} + '%'
OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
OR CELL1 LIKE '%' + ${phoneNumber} + '%'       
OR FAX1 LIKE '%' + ${phoneNumber} + '%' `;

result = JSON.stringify(query);

query = await sql.query`SELECT Codice,RagioneSociale,Referente,Ruolo,TEL1,TEL2,TELCASA1,CELL1,FAX1,EMAIL1 FROM Connector.ReferenteConnector 	WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
OR TEL2 LIKE '%' + ${phoneNumber} + '%'
OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
OR CELL1 LIKE '%' + ${phoneNumber} + '%'       
OR FAX1 LIKE '%' + ${phoneNumber} + '%' `;

reuslt.push(JSON.stringify(query));

8 Risposte

  • Re: Node JS MSSQL Query in più tabelle

    Ciao, 
    mi sembra che siamo alle solite ?  ;-)

    nell codice che hai postato il famoso result di cui tuo Thread precedente , una volta non lo dichiari come local variable con il tipo const e altre volte come variabile globale.

    La stessa cosa la stai facendo con la variable query... una volta dichiarata come globale e una volta dichiarata come locale di tipo const.

    ;-)  non so più come dirtelo che è un modo esageratamente sbagliato di scrivere un qualsiasi codice ;-)

    Deve esserci una logica in ciò che scrivi, altrimenti come puoi pensare che per puro caso possa funzionare ?

    Te lo dico per il tuo bene, non prenderla come critica, 
    Il codice deve essere impostato in modo corretto, coerente, con la sua logica definendo le variabili per un uso corretto. Diversamente è tutto un terno al lotto. 

    Tu dirai che sono esempi... non vuol dire niente, anche gli esempi devono rispecchiare una certa logica e correttezza in ogni sua parte e definizioni.

  • Re: Node JS MSSQL Query in più tabelle

    28/05/2025 - mayers81 ha scritto:

    Se io invece volessi aggiungere i dati della seconda Query alla pima dovrei usare JSON.stringify()?

    ciao,

    nel caso potresti fare:

    const result1 = await sql.query`
      SELECT Codice, RagioneSociale, TEL1, TEL2, TELCASA1, CELL1, FAX1, EMAIL1
      FROM Connector.AnagraficaConnector
      WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
         OR TEL2 LIKE '%' + ${phoneNumber} + '%'
         OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
         OR CELL1 LIKE '%' + ${phoneNumber} + '%'
         OR FAX1 LIKE '%' + ${phoneNumber} + '%'
    `;
    
    let allResults = result1.recordset;
    
    if (allResults.length < 1) {
      const result2 = await sql.query`
        SELECT Codice, RagioneSociale, Referente, Ruolo, TEL1, TEL2, TELCASA1, CELL1, FAX1, EMAIL1
        FROM Connector.ReferenteConnector
        WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
           OR TEL2 LIKE '%' + ${phoneNumber} + '%'
           OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
           OR CELL1 LIKE '%' + ${phoneNumber} + '%'
           OR FAX1 LIKE '%' + ${phoneNumber} + '%'
      `;
    
      // union array
      allResults = allResults.concat(result2.recordset);
    }
    
    res.status(200).json(allResults);
    
    • recordset è già un array JavaScript e quindi hai bisogno di fare JSON.stringify
    • le due liste si uniscono semplicemente con: array1.concat(array2)
    • inutile risottilineare che le variabili devono essere trattate in modo coerente e corretto per evitare ambiguità e errori di riutilizzo.

    :
    In questo esempio cosa viene fatto?
    - solo se la prima query NON restituisce un recordset allora viene eseguita la seconda query

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

    Se invece le vuoi comunque eseguire  entrambe le query e concatenare i risultati, allora per esempio potresti fare :

    const result1 = await sql.query`
      SELECT Codice, RagioneSociale, TEL1, TEL2, TELCASA1, CELL1, FAX1, EMAIL1
      FROM Connector.AnagraficaConnector
      WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
         OR TEL2 LIKE '%' + ${phoneNumber} + '%'
         OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
         OR CELL1 LIKE '%' + ${phoneNumber} + '%'
         OR FAX1 LIKE '%' + ${phoneNumber} + '%'
    `;
    
    const result2 = await sql.query`
      SELECT Codice, RagioneSociale, Referente, Ruolo, TEL1, TEL2, TELCASA1, CELL1, FAX1, EMAIL1
      FROM Connector.ReferenteConnector
      WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
         OR TEL2 LIKE '%' + ${phoneNumber} + '%'
         OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
         OR CELL1 LIKE '%' + ${phoneNumber} + '%'
         OR FAX1 LIKE '%' + ${phoneNumber} + '%'
    `;
    
    // union results
    const allResults = result1.recordset.concat(result2.recordset);
    
    res.status(200).json(allResults);
    
    • se entrambe oppure no restituiscono un recordset, vengono concatenati i due risultati.
    • se entrambe non restituiscono un recordset, allora allResults sarà semplicemente un array vuoto.
    • si può testare il risultato su allResults secondo le proprie necessità per pilotare le azioni da eseguire successivamente.
    • inutile risottilineare che le variabili devono essere trattate in modo coerente e corretto per evitare ambiguità e errori di riutilizzo ;-)

    :

  • Re: Node JS MSSQL Query in più tabelle

    Inanzi tutto ti ringrazio tantissimo per il supporto

    Avevo provato con l'utilizzo di UNION nella query ma siccome le tabelle non sono identiche mi restituice 

    ""All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.""

    Ho compreso l'errore nella dichiarazione 

    Attuale codice funzionante

    In questa funzione cero il numero di telefono lo cerco prima in una tabella e solo se non lo trovo lo cero nella seconda, restituisco solo un valore anche in caso ne trovi più di uno quindi restituisco il primo perchè chi riceve la richiesta si aspetta un solo valore

    async function getContactByPhone(phoneNumber) {
      try {
        await sql.connect(config);
    
    
        const result1 = await sql.query`
                                        SELECT Codice, RagioneSociale, TEL1, TEL2, TELCASA1, CELL1, FAX1, EMAIL1
                                        FROM Connector.AnagraficaConnector
                                        WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
                                        OR TEL2 LIKE '%' + ${phoneNumber} + '%'
                                        OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
                                        OR CELL1 LIKE '%' + ${phoneNumber} + '%'
                                        OR FAX1 LIKE '%' + ${phoneNumber} + '%'
                                      `; 
        if(result1.recordset.length < 1)
        {
          const result2 = await sql.query`
                                        SELECT Codice, RagioneSociale, Referente, Ruolo, TEL1, TEL2, TELCASA1, CELL1, FAX1, EMAIL1
                                        FROM Connector.ReferenteConnector
                                        WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
                                          OR TEL2 LIKE '%' + ${phoneNumber} + '%'
                                          OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
                                          OR CELL1 LIKE '%' + ${phoneNumber} + '%'
                                          OR FAX1 LIKE '%' + ${phoneNumber} + '%'
                                        `;                              
          if(result2.recordset.length < 1)
          {
            return { status: 404, data: { message: 'valore non trovato' } };
          }
          else
          {
            return { status: 200, data: result2.recordset[0] };
          }
        }
        else
        {
          return { status: 200, data: result1.recordset[0] };
        }
      } catch (err) {
        return { status: 500 , data: { message: err.message}};
      } finally {
        sql.close();
      }
    }

    In questa funzione invece cerco il numero prima in una tabella poi nell'altra e restituisco tutti i valori trovati.

    async function getContactByPhone(phoneNumber) {
      try {
        await sql.connect(config);
    
    
        const result1 = await sql.query`
                                        SELECT Codice, RagioneSociale, TEL1, TEL2, TELCASA1, CELL1, FAX1, EMAIL1
                                        FROM Connector.AnagraficaConnector
                                        WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
                                        OR TEL2 LIKE '%' + ${phoneNumber} + '%'
                                        OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
                                        OR CELL1 LIKE '%' + ${phoneNumber} + '%'
                                        OR FAX1 LIKE '%' + ${phoneNumber} + '%'
                                      `; 
        if(result1.recordset.length < 1)
        {
          const result2 = await sql.query`
                                        SELECT Codice, RagioneSociale, Referente, Ruolo, TEL1, TEL2, TELCASA1, CELL1, FAX1, EMAIL1
                                        FROM Connector.ReferenteConnector
                                        WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
                                          OR TEL2 LIKE '%' + ${phoneNumber} + '%'
                                          OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
                                          OR CELL1 LIKE '%' + ${phoneNumber} + '%'
                                          OR FAX1 LIKE '%' + ${phoneNumber} + '%'
                                        `;                              
          if(result2.recordset.length < 1)
          {
            return { status: 404, data: { message: 'valore non trovato' } };
          }
          else
          {
            return { status: 200, data: result2.recordset[0] };
          }
        }
        else
        {
          return { status: 200, data: result1.recordset[0] };
        }
      } catch (err) {
        return { status: 500 , data: { message: err.message}};
      } finally {
        sql.close();
      }
    }

    Molto probabilmente le due funzioni potrebbero essere accorpate in una con una variabile booleana che mi gestisce il comportamente quindi true cerca tutti i contatti false solo uno. Ma intanto sono contento del risultato ottenuto

  • Re: Node JS MSSQL Query in più tabelle

    30/05/2025 - mayers81 ha scritto:

    Inanzi tutto ti ringrazio tantissimo per il supporto

    Avevo provato con l'utilizzo di UNION nella query ma siccome le tabelle non sono identiche mi restituice 

    Ciao, 

    è chiaro che puoi concatenare cose unguali , simili o più o meno non ha senso ;-)

    Ma questo lo puoi solo sapere tu, il database lo conosci tu com'è strutturato.

    30/05/2025 - mayers81 ha scritto:

    Attuale codice funzionante

    In questa funzione cero il numero di telefono lo cerco prima in una tabella e solo se non lo trovo lo cero nella seconda, restituisco solo un valore

    Vedo che finalmente stai dichiarando le variabili ;-))

    bene bene !!! 
    adesso le stesse le puoi utilizzare anche in altri contesti sempre dichiarandole locali in modo che hanno vita ed effetto solo dentro la singola funzione.
    Pertanto risultano essere variabili temporanee

  • Re: Node JS MSSQL Query in più tabelle

    30/05/2025 - mayers81 ha scritto:

    Avevo provato con l'utilizzo di UNION nella query ma siccome le tabelle non sono identiche mi restituice 

    ""All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.""

    Ho compreso l'errore nella dichiarazione 

    Tabella1 e tabella2 devono avere gli stessi campi.

    Anagrafica{codice;ragione sociale;tel1;tel2;telcasa1;cell1;fax1;email1}

    Referente ha in più i campi referente e ruolo

    Anagrafica{codice;ragione sociale;referente;ruolo;tel1;tel2;telcasa1;cell1;fax1;email1}

    La Union sarà 

    SELECT Codice,RagioneSociale,TEL1,TEL2,TELCASA1,CELL1,FAX1,EMAIL1 
    FROM Connector.AnagraficaConnector 
    WHERE TEL1 LIKE '%' + 	${phoneNumber} + '%'
    OR TEL2 LIKE '%' + ${phoneNumber} + '%'
    OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
    OR CELL1 LIKE '%' + ${phoneNumber} + '%'       
    OR FAX1 LIKE '%' + ${phoneNumber} + '%' `
    Union
    SELECT Codice,RagioneSociale,TEL1,TEL2,TELCASA1,CELL1,FAX1,EMAIL1 FROM Connector.ReferenteConnector 	WHERE TEL1 LIKE '%' + ${phoneNumber} + '%'
    OR TEL2 LIKE '%' + ${phoneNumber} + '%'
    OR TELCASA1 LIKE '%' + ${phoneNumber} + '%'
    OR CELL1 LIKE '%' + ${phoneNumber} + '%'       
    OR FAX1 LIKE '%' + ${phoneNumber} + '%' `

    la.sql restituisce da zero a N record... Almeno dovrebbe

    Insieme vuoto unione insieme vuoto= insieme vuoto

    Insieme 1 elemento unione insieme vuoto=insieme 1 elemento E viceversa

    Insieme 1 unione insieme 1 = insieme di due elementi

    quello che vale per 1 vale per n (usi LIKE quindi se si tratta di numeri a centralino con base+interno ottieni n record che hanno quella base o al caso limite, il prefisso)

    Ottenuta la matrice di array della sql puoi farci quello che vuoi.

    Occhio a come filtri i record per non incorrere a errori di ricerca 

  • Re: Node JS MSSQL Query in più tabelle

    02/06/2025 - sihsandrea ha scritto:

    Tabella1 e tabella2 devono avere gli stessi campi.

    Non si capisce l'esigenza di tornare indietro nella discussione dove taluni temi sono stati già affrontati e risolti.

    Genera confusione, non è stato richiesto dall'OP. il thread diventa di difficile comprensione non seguendo più un filo logico.

    In più si presenta una soluzione nella quale sussistono diversi errori di sintassi, errori di logica e di tecniche:

    • concatenare le variabili comporta rischi di protezione SQL injection.
      • si devono usano i parametri
    • i valori nelle Like non vengono normalizzati e se contengono caratteri speciali si presentono errori imprevisti
    • non si tiene conto di valori null :
      • eventuali valori Null per talune colonne possono escludere comunque dei records che invece dovrebbero essere inclusi
    • se esistono dati duplicati come per esempio Codice :
      • si possono perdere dell'informazioni presenti in una tabella e non nell'altra e viceversa
      • si perde l'origine dei Dati... non sarà noto da quale tabella provengono le informazioni
    • per grandi moli di dati è sconsigliabile ed inefficiente tale sistema (pessime performance)
    • etc... etc....

    :
    Totalmente sbagliato proporre e/o sbandierare delle Soluzioni risolutive, quando le stesse presentano tanti punti di criticità non analizzati, senza apportare le dovute considerazioni e correzioni e quant'altro di utile.
    Ma soprattutto altrettanto inutile tornare indietro nella discussione quando l'OP ha già fatto talune considerazioni e scelto una strada ben diversa.

  • Re: Node JS MSSQL Query in più tabelle

    Non ne vale la pena ribattere.

  • Re: Node JS MSSQL Query in più tabelle

    03/06/2025 - sihsandrea ha scritto:

    Non ne vale la pena ribattere.

    Anche perchè sei andato in flame è ho lo screenshot di quello che avevi scritto.

    Non ho mai dato una soluzione definitiva, ho sempre utilizzato riportando il codice dell'OP e ho sempre utilizzato il condizionale.
    Leggere attentamente i post per cortesia prima di fare affermazioni fuori luogo.

    Al contrario presentare una soluzione affermando "si fa così la union", vuole solo significare che l'unica soluzione corretta è quella presentata. 
    Ma la stessa non va bene come soluzione, e ho già dettagliato i motivi in modo che anche l'OP possa individuare e correggere i punti critici anche nel suo codice. 

    Ma la stessa viene proposta quando l'OP ha già abbandonato tale strada per fare in modo completamente diverso.
    Questo vuol dire solo creare confusione interrompendo il filo logico del Thread e la sua naturale conclusione.

    [N.B.]

    Soprattutto all'attenzione dei Moderatori.

    Quando millanti e mi accusi che faccio uso di "link di codice preconfezionato"  è denigrazione, bullismo mirato ad offendere le capacità intellettive.
    Beh, questo agire e questo dire, io non lo definisco "polemica", è un chiaro attacco ingiustificato alla persona. 

    Questi sono i fatti... adesso potete mistificare tutto quello che volete. Che poi si ha l'ardire di affermare che io faccio flame ? mah!

Devi accedere o registrarti per scrivere nel forum
8 risposte