2017-08-15 14 views
-1

私は6つのテーブルを持つSQL Serverデータベースを持っています。複数のテーブルの値の一致

これらの表には、顧客名のタイプがあります。表の一つで

  • :表二つにForename、姓
  • :表三の最初の名前、セカンドネーム
  • :姓、姓

などなど6つのテーブル間。

  • フルネーム(姓と名のCONCAT)すべてのテーブル全体に表示されます:私が何をしようとしています何

    は何回のカウントを取得します。

  • フルネーム(姓と名のCONCAT)は5つのテーブル
  • フルネーム(姓と名のCONCAT)の両端に現れるが4つのテーブル などなど
  • フルネーム(第一のCONCATと全体に表示されます姓)は、表1にのみ表示されます

SQL内でこのタイプの操作を行う簡単な方法はありますか?

ありがとうございました

+0

関連のない、しかし:あなたがテーブルの上に他のクエリを実行する場合は、列の値を連結するとき、にご注意します(あなたがそれらを選択しない限り)。動的値にインデックスを使用することはできません。例えば、索引が存在する場合は、 'select * from table where first_name = 'John'とlast_name = 'Doe'を使用しますが、これは索引を使用しません。select * from table where concat(first_name 、last_name)= 'JohnDoe') '。私はあなたの質問に明示された 'CONCAT'を持っているので、これだけを言います。 – RToyo

答えて

1

私はあなたがunion allとたいと思います。あなたが求めている以上に、以下のことがあります。各テーブルに名前が表示される回数を返します。

あなたは簡単にあなたが好きなら、ちょうどテーブル・カウントのためにそれを簡素化することができます:あなたの特定の質問に

select t1, t2, t3, t4, t5, t6, count(*) as cnt, 
     min(fullname), max(fullname) 
from (select fullname, 
      sum(t1) as t1, sum(t2) as t2, sum(t3) as t3, sum(t4) as t4, 
      sum(t5) as t5, sum(t6) as t6 
     from ((select firstname + ' ' + lastname as fullname, 
        1 as t1, 0 as t2, 0 as t3, 0 as t4, 0 as t5, 0 as t6 
      from t1 
      ) union all 
      (select firstname + ' ' + lastname as fullname, 
        0 as t1, 1 as t2, 0 as t3, 0 as t4, 0 as t5, 0 as t6 
      from t2 
      ) union all 
      . . . 
      ) t 
     group by fullname 
    ) f 
group by t1, t2, t3, t4, t5, t6; 
+0

ありがとうございました。 この問題を解決するために苦労しています。 ** all ** t1、t2などをテーブル名で置き換えるべきですか? これをテストするには、これを表1(得意先)と表2(CustSystem2)で動作させようとしていますが、どこが間違っているのか分かりません。 ( '無効なオブジェクト名'エラーを取得!) – NewAtThis

+0

@NewAtThis。 。 。エイリアスの前にテーブル名を追加できます。たとえば、 'from customers t1'、' from CustSystem2 t2'などです。あなたは 'を記入する必要があります。 。追加のテーブルと。 –

+0

私はこれを取得し始めていると思う - ちょうど!! DBFiddleを作成して理解を深めてください。 [link](http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=30310edeb1c0e14f946a82d4675ba037) – NewAtThis

0

おそらくこのようなものです。

Select Name 
     ,Hits=count(*) 
     ,Tables = count(distinct Src) 
From (
     Select Src='Table1',Name=concat(FirstName,LastName) From Table1 
     Union All 
     Select Src='Table2',Name=concat(Foreame,SurName) From Table2 
     Union All 
     Select Src='Table3',Name=concat(FirstName,SurName) From Table3 
     Union All 
     ... Add more tables here 
    ) A 
Group By Name 
Having count(*)>1 

EDIT - ワーキングサンプルやdbFiddle

Declare @Table1 table (FirstName varchar(50),LastName varchar(50)) 
Insert Into @Table1 values 
('John','Smith') 
,('Mary','Smith') 

Declare @Table2 table (ForeName varchar(50),SurName varchar(50)) 
Insert Into @Table2 values 
('John','Smith') 
,('Mary-Ann','Jenson') 


Select Name 
     ,Hits=count(*) 
     ,Tables = count(distinct Src) 
From (
     Select Src='Table1',Name=concat(FirstName,LastName) From @Table1 
     Union All 
     Select Src='Table2',Name=concat(ForeName,SurName) From @Table2 
    ) A 
Group By Name 
Having count(*)>1 

戻り

Name  Hits Tables 
JohnSmith 2  2 
+0

Johnに感謝します。 'Table1'を実際のテーブル名 'Customers'に変更すると、無効なオブジェクト名エラーが発生します。 – NewAtThis

+0

@NewAtThisテーブルごとにフィールド名を同期しましたか?実際のテーブル名と関連するフィールド名がなければ、私はイラストだけを提供することができました.... fyi Srcは任意の値、つまり1 - 6です。 –

+0

@NewAtThisこれはhttp://dbfiddle.uk/のイラストですか?rdbms = sqlserver_2016&fiddle = 9e80fc47d6bc49ca19a3725cb4cf3eb5作成されたテーブルは2つしか作成されませんが、アソートが動作することを示しています –

関連する問題