2017-08-15 163 views
-1

我有一個帶有6個表的SQL Server數據庫。跨多個表匹配值

這些表格中有一種客戶名稱。

  • 在表一:用的名字,姓
  • 在表二:名字,第二個名字
  • 在表三:姓,姓

等等等等橫跨6張桌子。

我所試圖做的就是有多少次的計數:

  • 全名(姓和名的CONCAT)對所有的表出現。
  • 全名(姓氏和名字的CONCAT)跨越5個表
  • 全名(姓氏和名字的CONCAT)出現出現跨越4個表 等等等等
  • 全名(初的CONCAT和姓氏)​​只出現在表1中

在SQL中有沒有一種簡單的方法來做這種類型的事?

謝謝

+0

無關你的具體問題,但如果你在表上執行其他查詢,請注意當您連接列值(除非你選擇它們)。該索引不能用於動態值。例如,這將使用索引(如果索引存在):'select * from table where first_name ='John'and last_name ='Doe'',while this will not use an index'select * from table where concat(first_name ,last_name)='JohnDoe')'。我只提到這個,因爲你在你的問題中明確指出了「CONCAT」。 – RToyo

回答

1

我想你想一個union allgroup by。以下幾點比你要求的要多一點。它返回名稱在每個表中出現的次數。

您可以輕鬆地把它簡化爲只表計,如果你喜歡:

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

謝謝Gordon。努力完成這項工作。 我應該用表名替換** all ** t1,t2等嗎? 只是爲了測試它,我只是試圖讓它與表1(客戶)和表2(CustSystem2)一起工作,但無法看到我出錯的地方。 (Get'Invalid Object Name'errors!) – NewAtThis

+0

@NewAtThis。 。 。如果你喜歡,你可以在別名之前添加表名:'來自Customers t1','來自CustSystem2 t2',等等。你需要填寫'。 。 .'與額外的桌子。 –

+0

認爲我開始得到這個 - 只是! 已經創建了一個DBFiddle來嘗試理解。 [鏈接](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 

編輯 - 工作樣品或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

謝謝約翰。 當將'Table1'更改爲'Customers'的實際表名時,我只是得到無效的對象名稱錯誤。 – NewAtThis

+0

@NewAtThis你是否同步每個表的字段名稱。沒有實際的表名和相關的字段名稱,我只能提供一個插圖.... fyi Src可以是任何不同的值,即1 - 6 –

+0

@NewAtThis這是一個關於http://dbfiddle.uk/的插圖?rdbms = sqlserver_2016&fiddle = 9e80fc47d6bc49ca19a3725cb4cf3eb5只創建了兩個表,但是證明了這個appoach的工作原理 –