Come faccio a confrontare i 2 righe della stessa tabella (SQL Server)

Ho bisogno di creare un processo in background che elabora una tabella per righe che corrispondono a un determinato id con diversi stati. Memorizza i dati di riga in una stringa di confrontare i dati con una riga con un id corrispondente.

Conosco la sintassi per ottenere i dati di riga, ma non ho mai provato a confrontare 2 righe della stessa tabella prima? Come e ‘ fatto? Avrei bisogno di utilizzare le variabili per memorizzare i dati da ogni? O in qualche altra maniera?

(Utilizzo di SQL Server 2008)

InformationsquelleAutor | 2009-02-04

 

5 Replies
  1. 33

    È possibile partecipare a una tabella a se stesso tante volte quanto si richiede, è chiamato un self-join.

    Un alias è assegnato a ciascuna istanza della tabella, come nell’esempio qui sotto) per differenziare l’uno dall’altro.

    SELECT a.SelfJoinTableID
    FROM   dbo.SelfJoinTable a
           INNER JOIN dbo.SelfJoinTable b
             ON a.SelfJoinTableID = b.SelfJoinTableID
           INNER JOIN dbo.SelfJoinTable c
             ON a.SelfJoinTableID = c.SelfJoinTableID
    WHERE  a.Status = 'Status to filter a'
           AND b.Status = 'Status to filter b'
           AND c.Status = 'Status to filter c' 
    • Buon per voi per ricordare che è necessario alias
    • non proprio come molte volte come si richiede.. c’è un limite di riferimento 256 tabelle nella query :]
    • intrigante come sembra, Microsoft docs su SQL Server limitazioni diversi dal tuo argomento – Tables per SELECT statement - Limited only by available resources. Io non sono ancora sicuro se sto andando mai utilizzare queste informazioni a meno che io non qualcosa di realmente terribilmente ma vorrei sapere come hai ottenuto quel numero, sicuramente sembra intrigante.
    • Girraj Bene.. non posso citare la fonte, dopo un lungo periodo di tempo. Penso che mi sono imbattuto su che in SQL Server 2005… Corrente docs dice che non ci sono limiti, ma andare avanti e provare a eseguire un SQL 🙂 pastebin.com/hfSGiNkQ
    • Mi dispiace non ho notato quanto sia vecchio questo post è stato :). Io accettare che questa è una limitazione che non esiste in versioni più recenti. E, ho eseguito la query di riferimento e l’uscita è venuto fuori per essere There is insufficient system memory in resource pool 'default' to run this query. dopo 3 min.
  2. 11

    OK, dopo 2 anni è arrivato il momento di correggere la sintassi:

    SELECT  t1.value, t2.value
    FROM    MyTable t1
    JOIN    MyTable t2
    ON      t1.id = t2.id
    WHERE   t1.id = @id
            AND t1.status = @status1
            AND t2.status = @status2
    • NON si deve usare quella sintassi. Uso specifico che unisce, invece. Di destra e di sinistra si unisce forme di sintassi che sono obsolete. Non sarei sorpreso di trovare questo modulo obsoleto nella prossima versione.
    • Puoi fornire il link a cui si è accennato sconsigliato per favore?
    • ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10sq_GetStart/html/c10eeaa5-3d3c-49b4-a4bd-5dc4fb190142.htm E anche se non lo erano;t deprecato, di destra e di sinistra versioni non deve essere usato come danno incoerente e a volte impreciso risultati. A volte può essere interpretato come un cross join invece di un left o right join.
    • Questo link potrebbe essere di più l’utilizzo di ms-aiuto guff: msdn.microsoft.com/en-us/library/dd172122.aspx
  3. 6

    Alcune persone trovano la seguente sintassi alternativa più facile vedere quello che sta succedendo:

    select t1.value,t2.value
    from MyTable t1
        inner join MyTable t2 on
            t1.id = t2.id
    where t1.id = @id

Lascia un commento