2016-03-28 30 views
0

我會盡我所能來總結我遇到的問題。直到最近我從未使用過很多SQL。SQL邏輯:查找具有相似行的非重複項

目前,我在工作中使用SQL Server 2012,並且一直試圖在SQL表中查找異常。具體而言,這些表包含有關服務器的類似信息我知道這種元。所以他們每個人都分享一個名爲「DB_NAME」的專欄。之後,沒有類似的列。因此,我需要比較表A和表B,並生成服務器未在表A和B中列出的記錄(服務器)列表。此外,此查詢正在針對例外列表運行。我不是100%確定最好的處理方法。雖然我很想得到一些「非常有效」的東西,但我更關注的是目前只是簡單的東西。

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] 

回答

0

這是使用EXCEPT的另一個選項。我在工會的每一半都加了一個小組,因爲如果DB_NAME在您的表中是唯一的,那麼在原始文章中就不清楚了。

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

這對我有意義。謝謝,肖恩! – Erik

1

一種方法是使用union all和聚集:

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是不區分大小寫的默認。如果您的安裝區分大小寫,我會在查詢中留下upper()

+0

欣賞如此快速的迴應,戈登。我用適當的列名稱替換了_name_,並用表格的實際名稱替換了表格A,B和C等。我相信沒有交易。 我不理解的是: 「」 A「作爲」 和 ‘’B「作爲」 連同 ‘具有計數(不同哪個)<> 2;’ 我知道我們試圖過濾掉沒有2的結果,但我不一定能夠掌握髮生的事情。此外,我現在獲得回報: 消息8155,級別16,狀態2,行9 未對'ab'的列1指定列名稱。 不知道這是否有幫助。 – Erik