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

このようなクイックレスポンス、Gordonを高く評価してください。私は_name_を適切な列名に置き換えました。テーブルA、B、Cはテーブルの実際の名前などで置き換えられました。 とともに 「と」は「 と 『』 Bとして 「」A」 『のカウント(個別の)<> 2を持つ;』:私は理解していない何 です 私は、2がない場合に結果を除外しようとしていることを理解していますが、何が起こっているのか必ずしも把握していません。さらに、私は今戻り値を取得しています: メッセージ8155、レベル16、状態2、行9 'ab'の列1に列名が指定されていません。 その情報が役立つかどうかは不明です。 – Erik

関連する問題