in

UGISS Community

Il sito della community dello User Group Italiano di SQL Server

Except Bi-direzionale

Last post 07-14-2010 15.53 by sgovoni. 1 replies.
Page 1 of 1 (2 items)
Sort Posts: Previous Next
  • 07-14-2010 15.09

    • Supergimi
    • Top 50 Contributor
      Male
    • Joined on 06-04-2007
    • Milano
    • Posts 38
    • Points 610

    Except Bi-direzionale

    Ciao,

    ho due tabelle identiche e devo individuare i record presenti in una delle tue tabelle e non nell'altra e viceversa.

    Praticamente l'opposto della INNER JOIN.

     Chiamando le due tabelle TabellaA e TabellaB, oltre al comando

    (SELECT colonna FROM TabellaA EXCEPT SELECT colonna FROM TABELLAB),'Solo A'

    UNION

    (SELECT colonna FROM TabellaB EXCEPT SELECT colonna FROM TABELLAA), 'Solo B'

    ci sono altre soluzioni + efficaci e corrette?

     

    Grazie

    Lorenzo

    http://community.ugiss.org/blogs/Supergimi/
    • Post Points: 20
  • 07-14-2010 15.53 In reply to

    • sgovoni
    • Top 10 Contributor
      Male
    • Joined on 10-18-2007
    • Posts 431
    • Points 6.940

    Re: Except Bi-direzionale

    Ciao Lorenzo,

    Supergimi:

    ho due tabelle identiche e devo individuare i record presenti in una delle tue tabelle e non nell'altra e viceversa.

    Praticamente l'opposto della INNER JOIN.

    Non ho mai avuto l'occasione di provare EXCEPT e INTERSECT su grandi quantità di dati per verificarne le performance, comunque perchè non utilizzi una LEFT OUTER JOIN come nell'esempio seguente ?

    use [tempdb];
    go

    if object_id('dbo.TabellaA', 'U') is not null
      drop table dbo.TabellaA;
    go

    create table dbo.TabellaA
    (
      id int identity(1, 1) not null primary key (id)
      ,colonna varchar(20)
    )
    go

    if object_id('dbo.TabellaB', 'U') is not null
      drop table dbo.TabellaB;
    go

    create table dbo.TabellaB
    (
      id int identity(1, 1) not null primary key (id)
      ,colonna varchar(20)
    )
    go

    insert into dbo.TabellaA
    (colonna)
    values
    ('A'), ('B'), ('C');
    go

    insert into dbo.TabellaB
    (colonna)
    values
    ('A'), ('D'), ('E')
    go

    SELECT tabellaA.colonna, 'Solo_in_A' from dbo.TabellaA
    LEFT JOIN dbo.TabellaB on TabellaA.colonna = TabellaB.colonna
    WHERE (TabellaB.colonna is Null)

    UNION

    SELECT TabellaB.colonna, 'Solo_in_B' from dbo.TabellaB
    LEFT JOIN dbo.TabellaA on TabellaB.colonna = TabellaA.colonna
    WHERE (TabellaA.colonna is null);

    Con i dati di prova inseriti avresti questo output:

    colonna             
    --------------------  ---------
    B                    Solo_in_A
    C                    Solo_in_A
    D                    Solo_in_B
    E                    Solo_in_B

    L'indice sulla colonna "colonna" sia in dbo.TabellaA che in dbo.TabellaB è altamente consigliato Smile.

    Ciao!

    Sergio Govoni, SQL Server MVP | MVP Profile | Blog | Twitter |
    • Post Points: 5
Page 1 of 1 (2 items)
(C) 2007 User Group Italiano di SQL Server