2016-03-28 61 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