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语句。