将具有多个数量的行转换为单个数量的多行,同时加入另一个 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
我有 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