我有一個帶有6個表的SQL Server數據庫。跨多個表匹配值
這些表格中有一種客戶名稱。
- 在表一:用的名字,姓
- 在表二:名字,第二個名字
- 在表三:姓,姓
等等等等橫跨6張桌子。
我所試圖做的就是有多少次的計數:
- 全名(姓和名的CONCAT)對所有的表出現。
- 全名(姓氏和名字的CONCAT)跨越5個表
- 全名(姓氏和名字的CONCAT)出現出現跨越4個表 等等等等
- 全名(初的CONCAT和姓氏)只出現在表1中
在SQL中有沒有一種簡單的方法來做這種類型的事?
謝謝
我有一個帶有6個表的SQL Server數據庫。跨多個表匹配值
這些表格中有一種客戶名稱。
等等等等橫跨6張桌子。
我所試圖做的就是有多少次的計數:
在SQL中有沒有一種簡單的方法來做這種類型的事?
謝謝
我想你想一個union all
和group 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;
謝謝Gordon。努力完成這項工作。 我應該用表名替換** all ** t1,t2等嗎? 只是爲了測試它,我只是試圖讓它與表1(客戶)和表2(CustSystem2)一起工作,但無法看到我出錯的地方。 (Get'Invalid Object Name'errors!) – NewAtThis
@NewAtThis。 。 。如果你喜歡,你可以在別名之前添加表名:'來自Customers t1','來自CustSystem2 t2',等等。你需要填寫'。 。 .'與額外的桌子。 –
認爲我開始得到這個 - 只是! 已經創建了一個DBFiddle來嘗試理解。 [鏈接](http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=30310edeb1c0e14f946a82d4675ba037) – NewAtThis
也許是這樣的。
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
謝謝約翰。 當將'Table1'更改爲'Customers'的實際表名時,我只是得到無效的對象名稱錯誤。 – NewAtThis
@NewAtThis你是否同步每個表的字段名稱。沒有實際的表名和相關的字段名稱,我只能提供一個插圖.... fyi Src可以是任何不同的值,即1 - 6 –
@NewAtThis這是一個關於http://dbfiddle.uk/的插圖?rdbms = sqlserver_2016&fiddle = 9e80fc47d6bc49ca19a3725cb4cf3eb5只創建了兩個表,但是證明了這個appoach的工作原理 –
無關你的具體問題,但如果你在表上執行其他查詢,請注意當您連接列值(除非你選擇它們)。該索引不能用於動態值。例如,這將使用索引(如果索引存在):'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