将具有多个数量的行转换为单个数量的多行,同时加入另一个 table 与部分数据

Convert a row with multiple quantity to multiple rows of single quantity while joining another table with partial data

我有 2 个 table,一个带有 ID 及其计数,另一个带有属于各自 ID 的名称。它们需要连接起来,以便最终结果是 table,每行计数为 1,旁边是各自的名称。请注意,在某些情况下,table 2 中的名称数量少于 table 1 中相同 ID 的数量。

Table 1

ID  | Count
-----------
100 | 3
101 | 2
102 | 4

Table 2

ID  | Name
----------
100 | abc       
100 | def       
101 | ghi       
101 | jkl       
102 | mno       
102 | pqr       
102 | stu       

结果

ID  | Count | Name
------------------
100 | 1     | abc
100 | 1     | def
100 | 1     |
101 | 1     | ghi
101 | 1     | jkl
102 | 1     | mno
102 | 1     | pqr
102 | 1     | stu
102 | 1     |

我正在为此使用 TSQL,我当前的查询将 table 1 转换为结果 table 中的多行;然后它通过循环将 table 2 中的各个名称插入到结果 table 中。我希望必须有一种更简单或更有效的方法来执行此操作,因为当前方法需要花费大量时间。如果有,请告诉我。

我首先想到的是使用数字 table,您可以像这样创建(作为一次性任务):

CREATE TABLE numbers (
    ID INT
)

DECLARE @CurrentNumber INT, @MaxNumber INT
SET @MaxNumber = 100 -- Choose a value here which you feel will always be greater than MAX(table1.Count)
SET @CurrentNumber = 1

WHILE @CurrentNumber <= @MaxNumber
BEGIN
    INSERT INTO numbers VALUES (@CurrentNumber)
    SET @CurrentNumber = @CurrentNumber + 1
END

一旦你有了一个数字table,你可以这样解决这个问题:

SELECT  one.ID,
        1 AS [Count],
        ISNULL(two.Name,'') AS Name
FROM table1 one
JOIN numbers n ON n.ID <= CASE WHEN one.[Count] >= (SELECT COUNT(1) FROM table2 two WHERE one.ID = two.ID)
                            THEN one.[Count]
                            ELSE (SELECT COUNT(1) FROM table2 two WHERE one.ID = two.ID)
                          END
LEFT JOIN (SELECT   ID, 
                    Name,
                    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS RecordNo
            FROM table2) two ON one.ID = two.ID
                            AND two.RecordNo = n.ID