【问题标题】:How to build a view without repeating ids?如何在不重复 id 的情况下构建视图?
【发布时间】:2018-07-10 14:41:56
【问题描述】:

我想将三个表连接在一起并创建一个视图作为查找。问题是我得到了重复的provider id,因为provider_name 不同。

表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_id 中得到重复记录,这导致在我与其他表的连接中出现重复记录。我知道有一些方法可以使用this 之类的方法在连接端点表时避免这种情况,但对我来说,这似乎是一种绷带,而不是核心解决方案。

我目前的做法:

--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')

【问题讨论】:

  • 当同一个provider_id出现在两个不同的表中时,你需要决定怎么做。 sql中没有DWIM命令。
  • 与答案无关,但是在同一个查询中使用 DISTINCT 和 UNION 只是多余的。保留 UNION(首选)或 DISTINCT 语句。

标签: sql sql-server join view


【解决方案1】:

如果你不在乎名字,那就用GROUP BY

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() 应该做你想做的事。

【讨论】:

    【解决方案2】:

    一个小小的猜测,但我假设你在追求类似的东西:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2021-07-24
      相关资源
      最近更新 更多