2016-03-28 10 views
0

Neyle uğraştığımı özetlemek için elimden gelenin en iyisini yapacağım. Yakın zamana kadar çok fazla SQL kullanmamıştım.SQL Logic: Benzer Satırlarla Yinelenmeyenleri Bulma

Şu anda işte SQL Server 2012 kullanıyorum ve SQL tablolarında tuhaflıklar bulmaya çalışmakla görevlendirildim. Özellikle, tablolar sunucularla ilgili benzer bilgiler içerir. Ben bir tür meta, biliyorum. Dolayısıyla, her biri "DB_NAME" adlı bir sütunu paylaşıyor. Bundan sonra benzer sütunlar yoktur. Bu yüzden Tablo A ve Tablo B'yi karşılaştırmalı ve bir tablo BOTH Tablo A ve B'de listelenmemiş bir kayıt listesi (sunucu) üretmem gerekiyor. Ayrıca, bu sorgu bir istisna listesine karşı çalıştırılıyor. Bunu en iyi şekilde ele alabilmek için% 100 emin değilim. Ve "aşırı derecede verimli" bir şey elde etmeyi çok isterim, ben de o zamanlar o kadar sade olan bir şeye bakıyorum.

SELECT * 
FROM (SELECT 
      UPPER(ta.DB_NAME) AS [DB_Name] 
     FROM 
      [CMS].[dbo].[TABLE_A] AS ta 
     UNION 
     SELECT 
      UPPER(tb.DB_NAME) AS [DB_Name] 
     FROM 
      [CMS].[dbo].[TABLE_B] as tb 
     ) AS SQLresults 
WHERE NOT EXISTS (
    SELECT * 
    FROM 
     [CMS].[dbo].[TABLE_C_EXCEPTIONS] as tc 
    WHERE 
     SQLresults.[DB_Name] = tc.DB_NAME) 
ORDER BY SQLresults.[DB_Name] 

cevap

0

EXCEPT kullanarak başka bir seçenek daha. Sendromun her bir yarısında bir grup ekledim, çünkü DB_NAME tablonuzda benzersizse, orijinal yayında net değil.

select DatabaseName 
from 
(
    SELECT UPPER(ta.DB_NAME) AS DatabaseName 
    FROM [CMS].[dbo].[TABLE_A] AS ta 
    GROUP BY UPPER(ta.DB_NAME) 

    UNION ALL 

    SELECT UPPER(tb.DB_NAME) AS DatabaseName 
    FROM [CMS].[dbo].[TABLE_B] as tb 
    GROUP BY UPPER(tb.DB_NAME) 
) x 
group by DatabaseName 
having count(*) < 2 
EXCEPT 
(
    select DN_Name 
    from CMS.dbo.TABLE_C_EXCEPTION 
) 
+0

Bu bana mantıklı geldi. Çok teşekkür ederim Sean! – Erik

1

bir yöntemi union all ve agregasyonu kullanır:

select ab.* 
from ((select upper(name) as name, 'A' as which 
     from CMS.dbo.TABLE_A 
    ) union all 
     (select upper(name), 'B' as which 
     from CMS.dbo.TABLE_B 
    ) 
    ) ab 
where not exists (select 1 
        from CMS.dbo.TABLE_C_EXCEPTION e 
        where upper(e.name) = ab.name 
       ) 
having count(distinct which) <> 2; 

SQL Server harf duyarsız varsayılan gereğidir. Yüklemenizin büyük/küçük harfe duyarlı olması durumunda upper() s sorguya bıraktım.

+0

Böyle hızlı bir yanıt için teşekkür ederiz, Gordon. _name_ yerine uygun sütun adı ve tablo A, B ve C tabloları, tabloların gerçek isimleri ile değiştirildi. Orada anlaşma yok, inanıyorum. 'A 'olan' ve ' B, ile birlikte 'hangi' '> 2 <(ki, ayrı) sayısına sahip olan;': Anlamadığım kalmamasıdır Anladığım kadarıyla, 2 olmadığı yerde sonuçları filtrelemeye çalışıyoruz, ancak ne olduğunu anlayamıyorum. Ayrıca, şu anda geri dönüyorum: Msg 8155, Düzey 16, Durum 2, Satır 9 'Ab' sütun 1 için sütun adı belirtilmemiş. Bu, herhangi bir yardımcı olup olmadığından emin değil. – Erik

İlgili konular