2010-04-08 23 views
6

Görüşleri ve daha derin görünümler için yuvalama görünümleri yazarken bazen bir şeyleri özlüyorum ve satır/veri kaybetmeyi sonlandırıyorum. İki farklı tablodaki sütunların tam bir veri eşleşmesi olup olmadığını nasıl kontrol edebilirim?İki farklı tablonun iki sütununun tam olarak eşleştiğini doğrulayın.

Örnek:

select count(distinct table1.col1) 
    from table1 
where table1.col1 not in (select distinct table2.col1 
          from table2); 

Bu tablo2 olmayan table1.col1 değerlerin sayısını döndürecektir. Ancak, tablo1.col1'de bulunmayan table2.col1 değerlerini saymadığından bunun iyi bir çözüm olduğunu bilmiyorum.

+0

Tabiki yuvalama görünümleri genellikle kötü bir şeydir (En azından SQL Server'da). Geliştirme aşamasında iyi görünebilir, ancak bir kez prod'a gittiğinizde ve çok fazla kayıt yaptığınızda, sistemi görünümleri yerleştirerek aşağı doğru getirebilirsiniz. Bu iç içe geçmiş görünümleri, temel tablolara bir milyonlarca milyon test kaydı ekleyerek test ederim. – HLGEM

+0

gerçekten de, sorguları yeniden yazacağım, iç içe geçmiş görünümler dizesi oluşturarak, verilerin istediğim şekilde biçimlendiğini doğrulamak için başlangıçta kavramın kanıtıdır. Veritabanı açıldığında görünümleri yeniden düzenlerim. – galford13x

cevap

3

Kullanım:

SELECT MAX(x.t1_missing_count) AS t1_missing_count, 
     MAX(x.t2_missing_count) AS t2_missing_count 
    FROM (
SELECT COUNT(DISTINCT t1.col1) AS t1_missing_count, 
     NULL AS t2_missing_count 
    FROM TABLE_1 t1 
WHERE t1.col1 NOT IN (SELECT DISTINCT t2.col1 
         FROM TABLE_2 t2) 
UNION ALL 
SELECT NULL, 
     COUNT(DISTINCT t2.col1),   
    FROM TABLE_2 t2 
WHERE t2.col1 NOT IN (SELECT DISTINCT t1.col1 
         FROM TABLE_1 t1)) x 
+0

neden bir UNION kullanmayı düşünmediğimi bilmiyorum. Yani bir IN IN yan tümcesi alt sorgu kullanarak bunu almak gibi bir işlem için tamam? – galford13x

+0

@ galford13x: Şu anda kullanmak için en verimli olan üç - KAYBI OLMADAN, GİRİŞ ve SOL JOIN/IS NULL - hakkında bilgi yok. –

0
declare @count int, @count2 int 


select @count = count(distinct table1.col1) 
    from table1 
where table1.col1 not in (select distinct table2.col1 
          from table2) 

select @count2 = count(distinct table2.col1) 
    from table2 
where table2.col1 not in (select distinct table1.col1 
          from table1) 

select @count + @count2 
+0

SQLite'ı kullanarak MS SQL veya MySQL gibi dahili değişkenleri kullanabilir miyim? – galford13x

+0

Hmm, bu yeniden etiketlendi, sanırım Sql türü için kontrol ettim ... –

+0

Yeniden etiketlendiğini sanmıyorum, ancak SQL olarak etiketlendi :) – galford13x

1
select count(*) from (

select 
table1.col1 from table1 left join table2 on table1.col1 = table2.col2 
where table2.col1 is null 

union 

select table2.col1 from table2 left join table 1 on table2.col1 = table1.col1 
where table1.col1 is null 

) 
6

Sen kontrol etmek iki EXCEPT sorguları (veya birliktelik onlara) kullanabilirsiniz: table1 var değerlerini gösterecektir

SELECT DISTINCT col1 
FROM table1 
EXCEPT 
SELECT DISTINCT col1 
FROM table2 

ama table2 değil. Ardından, karşı taraf için ters çevrilmiş tablo adları ile tekrar çalıştırın.

+0

Sadeliği seviyorum. Farklılık sayısını elde etmek için SELECT count() ile sardım. Teşekkürler. – galford13x

İlgili konular