2012-07-05 13 views
5

Mam tabeli, strasznie zaprojektowane (nie mój sposób na szczęście), który przechowuje dane w sposób podobny do następujących:gdzie tabela. * <> Tabela. * - Czy istnieje sposób na zrobienie czegoś takiego?

klawisz [], [lease_id], [building_name], ~ 20 więcej kolumn Dane

Może zostać i będzie używany jako leasingobiorca dla centrum i centrali. Zostałem poproszony o znalezienie wszystkich przypadków, w których dane w budynku dla dzierżawy nie pasują do danych w centrali dla tej samej dzierżawy.

Mogę to zrobić całkiem łatwo z samo łączeniem. Wyzwanie polega na tym, że istnieje około 20 kolumn do porównania i chociaż mógłbym je wpisać ręcznie, zastanawiałem się, czy istnieje lepszy sposób na zrobienie tego (co również oznaczałoby, że zapytanie może być używane w przyszłości, uwzględniając zmiany w tabeli).

W syntaxtically śmiesznej psuedo Code chcę zrobić coś podobnego do tego, co następuje zrobiłby gdyby było pracować:

select lp.* 
from lease_proposal lp 
     inner join 
     (
      select * 
      from lease_proposal lp2 
      where building_id = '001' -- assume 001 is head office for sake of example 
     ) lp2 
      on lp2.lease_id = lp.lease_id 
where lp.* <> lp2.* 

Odpowiedz

5

Można wykonać operację INTERSECT znaleźć wszystkie wiersze gdzie dopasowane wszystkie dane, następnie LEFT JOIN że wynik i wybrać tylko te wiersze, w których nie było przecięcie:

SELECT 
    a.* 
FROM 
    lease_proposal a 
LEFT JOIN 
    (
     SELECT * 
     FROM lease_proposal 

     INTERSECT 

     SELECT * 
     FROM lease_proposal 
     WHERE building_id = 001 
    ) b ON a.lease_id = b.lease_id 
WHERE 
    b.lease_id IS NULL 

Jeśli SQL Server wspiera go, można również użyć NATURAL LEFT JOIN jak tak:

SELECT 
    a.* 
FROM 
    lease_proposal a 
NATURAL LEFT JOIN 
    (
     SELECT * 
     FROM lease_proposal 
     WHERE building_id = 001 
    ) b 
WHERE b.lease_id IS NULL 
+0

To nie jest dostępne w SQL Server, zobacz: http://stackoverflow.com/questions/4826613/natural-join-in-sql-server – Codingo

+0

To popchnęło moją wiedzę w górę - naprawdę świetny post, thank-you – Codingo

+2

Pozostawienie "SELECT * FROM leasing_proposal INTERSECT" poza zapytaniem przyniosłoby takie same wyniki. 'INTERSECT' ogranicza tylko duplikaty wierszy, w których' building_id = '001'', jeśli takie istnieją. Następnie używasz wynikowego podzestawu, aby znaleźć wiersze, które nie są zgodne z innymi kryteriami, i nie będzie to oznaczało, że podzbiór zawierał duplikaty lub nie, ponieważ nadal chciałbyś, aby wiersze, które * nie są * w podzbiorze. –

Powiązane problemy