Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di nicki
    Registrato dal
    Dec 2000
    Messaggi
    139

    Problema query di conteggio tuple

    Problema query:

    Ho 3 tabelle in ognuna delle quali c'é un campo IDCliente. Voglio contare Quante volte c'é un tal IDCliente nelle 3 tabelle, ossia:

    Num IDCliente in tab1 + Num IDCliente in tab2 +Num IDCliente in tab1.

    Per ora faccio 3 select count ma é pesante come operazione, soprattutto se la faccio ripetere per mooooolti IDCliente (->timeout session).

    Ho quindi pensato ad una FULL OUTER JOIN, ma mi sono incartato, mi restituisce numeri diversi a seconda dell'ordine delle tabelle nella query, e cmq numeri inesatti di anche 3 grandezze.

    Qualche suggerimento?
    Ciao, nic.

  2. #2
    Per prima cosa devi crearti un view con il seguente codice:

    CREATE VIEW dbo.VIEW1
    AS
    SELECT *
    FROM table1
    UNION ALL
    SELECT *
    FROM table2
    UNION ALL
    SELECT *
    FROM table3

    dopo di che per avere quel che cerchi esegui la seguente query

    SELECT id,Count(id) FROM View1 GROUP BY Id

  3. #3
    Utente di HTML.it L'avatar di nicki
    Registrato dal
    Dec 2000
    Messaggi
    139
    mmmm ma si tratta sempre di 3 select, pesa lo stesso, molto di più di una join.

    Se io dovessi controllare se un IDCliente é presente in almeno una tabella, come dovrei fare con una sola join?

    Io pensavo ad una FULL OUTER JOIN, ma non funziona, o meglio forse non la applico nel modo giusto...

    Soluzione con 3 select count:
    codice:
    MyComm.CommandText = "SELECT COUNT(*) FROM tblAggiornamenti WHERE IDCliente="+IDCliente;
    numeroOccorrenze += Convert.ToInt32(MyComm.ExecuteScalar());
    
    MyComm.CommandText = "SELECT COUNT(*) FROM tblStrumenti WHERE IDCliente="+IDCliente;
    numeroOccorrenze += Convert.ToInt32(MyComm.ExecuteScalar());
    			
    MyComm.CommandText = "SELECT COUNT(*) FROM tblStatoStrumento WHERE IDCliente="+IDCliente;
    numeroOccorrenze += Convert.ToInt32(MyComm.ExecuteScalar());
    Soluzione con un'unica FULL OUTER JOIN (errata)
    codice:
    string prova = " SELECT COUNT(*) FROM "+
    " tblAggiornamenti FULL OUTER JOIN tblStrumenti "+
    " ON tblAggiornamenti.IDCliente=tblStrumenti.IDCliente " +
    " FULL OUTER JOIN tblStatoStrumento  "+
    " ON tblAggiornamenti.IDCliente=tblStatoStrumento.IDCliente " +
    " WHERE tblAggiornamenti.IDCliente="+IDCliente+" AND "+
    " tblStrumenti.IDCliente="+IDCliente+" AND "+
    " tblStatoStrumento.IDCliente="+IDCliente;
    Soluzione: a volte mi ritorna un numero esagerato (80000 al posto di 83) a volte 0 quando in realtà la prima ritorna un num > 0. Quindi non funzia.
    :master:
    Ciao, nic.

  4. #4
    se devi controllare se un IDCliente é presente in almeno una tabella puoi utilizzare l'if exists
    IF EXISTS (SELECT IDCliente1, IDCliente2 FROM tabella1, tabella2 where IDCliente1=variabile1 and IDCliente2=variabile2)
    almeno così non lo appesantisci con una ricerca inutile

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.