2012-07-05 22 views
5

Ben, bir masa, korkunç (değil benim minnetle yapıyor) tasarlanmış olması aşağıdakine benzer bir şekilde verileri saklar: aitburada tablo. * <> Tablo. * - Böyle bir şey yapmanın bir yolu var mı?

[anahtar], [lease_id], [building_name], ~ 20 daha fazla sütun veri

Bir merkezle birlikte merkezin yanı sıra bir lease_id bulunabilir. Bir kira için bir binadaki verilerin aynı ofis için merkezdeki verilerle eşleşmediği tüm örnekleri bulmam istendi.

Bunu kolayca, kendi kendine birleştirme ile yapabilirim. Buradaki zorluk, karşılaştırmak için yaklaşık 20 sütun bulunması ve her birini el ile yazabilsem de, bunu yapmanın daha iyi bir yolu olup olmadığını merak etmekteydim (ki bu da sorgunun gelecekte kullanılabileceği anlamına geliyordu, herhangi bir tablo değişikliğinin hesaba katılması anlamına geliyordu)). Ben şu işe olsaydı ne yapacağını benzer bir şey yapmak istiyorum Kodunuzu syntaxtically saçma zikretmekte içine düştüğü sahte olarak

:

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.* 

cevap

5

Tüm veri eşleşen tüm satırları bulmak için bir INTERSECT operasyon yapabileceği, Daha sonra bir kavşak yoktu satırları neden basıp LEFT JOIN: SQL Server desteklerse

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 

, ayrıca şöyle bir NATURAL LEFT JOIN kullanabilirsiniz:

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

Bu bakınız SQL Server kullanılamaz: http://stackoverflow.com/questions/4826613/natural-join-in-sql-server Bu bir çentik bilgimi itti – Codingo

+0

- gerçekten büyük mesaj, Teşekkür ederim – Codingo

+2

"SELECT * FROM lease_proposal INTERSECT" sorgusundan çıkarken aynı sonuçları verir. 'INTERSECT', eğer varsa, 'building_id =' 001 '' çift satırlarını bastırır. Daha sonra, başka bir ölçütle eşleşmeyen satırları bulmak için sonuçta oluşan alt kümeyi kullanırsınız ve alt kümenin yinelenen içerip içermediğini belirtmezsiniz, çünkü alt kümede * olmayan * sıralar istemiş olursunuz. –

İlgili konular