Sql 如何在不重复ID的情况下构建视图?
我有三个表要连接在一起,并创建一个视图作为查找。问题是我得到了重复的Sql 如何在不重复ID的情况下构建视图?,sql,sql-server,join,view,Sql,Sql Server,Join,View,我有三个表要连接在一起,并创建一个视图作为查找。问题是我得到了重复的提供者id,因为提供者名称不同 表1 provider_id provider_name 545 Kent Hospital 表2 provider_id provider_name 565 Devin Hospital 表3 provider_id provider_name 545 Kent Medical Center 我得到: provider_id p
提供者id
,因为提供者名称不同
表1
provider_id provider_name
545 Kent Hospital
表2
provider_id provider_name
565 Devin Hospital
表3
provider_id provider_name
545 Kent Medical Center
我得到:
provider_id provider_name
545 Kent Hospital
545 Kent Medical Center
565 Devin Hospital
最终预期结果:
provider_id provider_name
545 Kent Hospital
565 Devin Hospital
实际上,使用哪个名称并不重要,因为它们通常几乎相同
但问题是,我在provider\u id
中得到了重复的记录,这导致了我与其他表的连接上的重复记录。我知道在端点表的连接上有一些方法可以避免这种情况,比如,但对我来说,这似乎是一种绷带,而不是核心的解决方案
我目前的做法是:
--CREATE VIEW lookup_providers AS
SELECT DISTINCT provider_id, provider_name
FROM table1
UNION
SELECT DISTINCT provider_id, provider_name
FROM table2
UNION
SELECT DISTINCT provider_id, provider_name
FROM table3
样本表
CREATE TABLE table1 (provider_id nvarchar(30), provider_name nvarchar(30))
CREATE TABLE table2 (provider_id nvarchar(30), provider_name nvarchar(30))
CREATE TABLE table3 (provider_id nvarchar(30), provider_name nvarchar(30))
INSERT INTO table1 (provider_id, provider_name) VALUES ('545','Kent Hospital')
INSERT INTO table2 (provider_id, provider_name) VALUES ('565','Devin Hospital')
INSERT INTO table3 (provider_id, provider_name) VALUES ('545','Kent Medical Center')
如果您不关心名称,请使用分组依据
:
SELECT provider_id, MIN(provider_name) as provier_name
FROM ((SELECT provider_id, provider_name
FROM table1
) UNION ALL
(SELECT provider_id, provider_name
FROM table2
) UNION ALL
(SELECT provider_id, provider_name
FROM table3
)
) tt
GROUP BY provider_id;
如果您想选择一个特定的名称——最长的、最短的、按表排序的名称,则有更复杂的机制。但是您可以指定任意名称,因此MIN()
应该做您想做的事情。稍微猜一猜,但我假设您想要的是:
CREATE VIEW lookup_providers AS
WITH CTE AS(
SELECT provider_id, provider_name
FROM table1
UNION
SELECT provider_id, provider_name
FROM table2
UNION
SELECT provider_id, provider_name
FROM table3),
RNs AS(
SELECT provider_id, provider_name,
ROW_NUMBER() OVER (PARTITION BY provider_id ORDER BY provider_name) AS RN
FROM CTE)
SELECT provider_id, provider_name
FROM RNs
WHERE RN = 1;
GO
您需要决定当相同的提供者id出现在两个不同的表中时要做什么。sql中没有DWIM命令。与答案无关,但是在同一查询中使用DISTINCT和UNION只是冗余的。保留UNION(最好)或DISTINCE语句。