【问题标题】:SQL Server - Need to create multiple rows based on lookup valueSQL Server - 需要根据查找值创建多行
【发布时间】:2017-10-06 20:26:38
【问题描述】:

如何根据另一个表中的公共值在新表中创建多行?

   ProviderTable:                                        PersonTable:
--------------------                                ---------------------
ProviderID | GroupID                                PersonID | ProviderID
    1      |    A                                      100   |      1
    2      |    A                                      101   |      3                                      
    3      |    A                                      102   |      8
    4      |   NULL                                    103   |      10
    5      |    B                                      104   |      5
    6      |    C                                      105   |      4
    7      |    B
    8      |   NULL
    9      |   NULL
    10     |    C

ProviderTable.ProviderID = PersonTable.ProviderID

我需要为 Provider.GroupID=Provider.GroupID 的每个提供者创建一个包含人员行的新表

我正在寻找的结果:

    New-table: 
PersonID | ProviderID
   100   |      1
   100   |      2
   100   |      3
   101   |      3
   101   |      1
   101   |      2
   102   |      8
   103   |      10
   103   |      6
   104   |      5
   104   |      7
   105   |      4

【问题讨论】:

    标签: sql-server lookup create-table multiple-records


    【解决方案1】:

    此快速版本可获取您正在寻找的排序顺序。包含测试数据:

    DECLARE @pt table (
        ProviderId int, 
        GroupId varchar(2)
        )
    
    DECLARE @pet table (
        PersonId int, 
        ProviderId int
        )
    
    INSERT INTO @pt Values 
        (1,'A'),
        (2,'A'),
        (3,'A'),
        (4,NULL),
        (5,'B'),
        (6,'C'),
        (7,'B'),
        (8,NULL),
        (9,NULL),
        (10,'C')
    
    INSERT INTO @pet VALUES 
        (100,1),
        (101,3),
        (102,8),
        (103,10),
        (104,5),
        (105,4)
    
    SELECT pe.PersonId, 
        IsNull(p2.ProviderId, p1.providerId) As ProviderId
    FROM @pt p1
    INNER JOIN @pet pe
        ON p1.ProviderId = pe.ProviderId
    LEFT JOIN @pt p2
        ON p1.GroupId = p2.GroupId
    ORDER BY pe.personId,
        CASE 
            WHEN pe.ProviderId = p2.ProviderId 
                Then 0
            ELSE 1
        END
    

    【讨论】:

    • 这确实使所有内容都按正确的排序顺序排列!谢谢!
    【解决方案2】:

    您可以使用以下 SQL 语句:

    SELECT PER.PersonID, COALESCE(PG.ProviderID, PP.ProviderID) AS ProviederID
       FROM PersonTable PER
          INNER JOIN ProviderTable PP
             ON PP.ProviderID = PER.ProviderID
          LEFT OUTER JOIN ProviderTable PG
             ON PG.GroupID = PP.GroupID;
    

    【讨论】:

    • 谢谢!这行得通!没想到合体!效果很好!
    猜你喜欢
    • 1970-01-01
    • 2012-08-24
    • 2015-04-06
    • 1970-01-01
    • 2016-06-13
    • 2018-10-29
    • 2021-12-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多