
[英]SQL Add empty rows in a Details Table per each Record in a Master Table - Modified Solution
[英]SQL Add empty rows in a Details Table per each Record in a Master Tble
我曾经在这个论坛上问过这个问题:
我需要将空行添加到SQL SELECT语句中,其结果应为10的倍数,这意味着如果表中有8行,则应添加2个空行,以便select语句有10行,如果表中有16行,应添加4空行,以便select语句有20行,依此类推。总之,选择的行必须始终为10、20、30、40等,以此类推
然后我得到了有效的答案。
DECLARE @tmpTable TABLE (ID INT, _Text NVARCHAR(255))
DECLARE @X INT=1
WHILE @X <9
BEGIN
INSERT INTO @tmpTable
VALUES (@X, 'XXXXX') SET
@X=@X+1 END SELECT * FROM @tmpTable
UNION ALL
SELECT TOP (10 - ISNULL(NULLIF((SELECT COUNT(*) FROM @tmpTable) % 10, 0), 10))
(SELECT MAX(ID) FROM @tmpTable)+n, NULL FROM (VALUES(1), (2),(3), (4),(5),
(6),(7), (8),(9), (10)) A(n)
结果
ID _Text
1 XXXXX
2 XXXXX
3 XXXXX
4 XXXXX
5 XXXXX
6 XXXXX
7 XXXXX
8 XXXXX
9 NULL
10 NULL
如果一个表中有16行,结果将是这样的:
DECLARE @tmpTable TABLE (ID INT, _Text NVARCHAR(255))
DECLARE @X INT=1
WHILE @X <17
BEGIN
INSERT INTO @tmpTable
VALUES (@X, 'XXXXX')
SET @X=@X+1
END
SELECT * FROM @tmpTable
UNION ALL
SELECT TOP (10 - ISNULL(NULLIF((SELECT COUNT(*) FROM @tmpTable) % 10, 0), 10))
(SELECT MAX(ID) FROM @tmpTable)+n, NULL
FROM (VALUES(1), (2),(3), (4),(5), (6),(7), (8),(9), (10)) A(n)
结果
ID _Text
1 XXXXX
2 XXXXX
3 XXXXX
4 XXXXX
5 XXXXX
6 XXXXX
7 XXXXX
8 XXXXX
9 XXXXX
10 XXXXX
11 XXXXX
12 XXXXX
13 XXXXX
14 XXXXX
15 XXXXX
16 XXXXX
17 NULL
18 NULL
19 NULL
20 NULL
但是,我想修改答案,以便它可以在“主/详细信息”方案中按如下方式工作:假设在主表中有两个记录,如下所示:
MasterID
1
2
并在详细信息表中假定以下记录:
ID MasterID DetailsDescription
1 1 XXXXX
2 1 XXXXX
3 1 XXXXX
4 1 XXXXX
5 1 XXXXX
6 1 XXXXX
7 2 XXXX
8 2 XXXX
9 2 XXXX
10 2 XXXX
11 2 XXXX
12 2 XXXX
13 2 XXXX
14 2 XXXX
我希望结果是:
ID MasterID DetailsDescription
1 1 XXXXX
2 1 XXXXX
3 1 XXXXX
4 1 XXXXX
5 1 XXXXX
6 1 XXXXX
1 NULL
1 NULL
1 NULL
1 NULL
7 2 XXXX
8 2 XXXX
9 2 XXXX
10 2 XXXX
11 2 XXXX
12 2 XXXX
13 2 XXXX
14 2 XXXX
2 NULL
2 NULL
这样,对于主记录1,必须在明细表中选择10条记录(即,添加4空行,因为在明细表中只有6条记录链接到主记录1),对于主记录2同样是10行应该在明细表中选择(即添加了2空行,因为在明细表中有8行链接到主记录2),等等,等等。
我尝试过这种方式,但最后添加了空行:
DECLARE @MasterTable TABLE(MasterID INT)
INSERT INTO @MasterTable
VALUES(1),(2)
DECLARE @DetailsTable TABLE (ID INT, MasterID INT, _Text NVARCHAR(255))
DECLARE @X INT=1
WHILE @X <7
BEGIN
INSERT INTO @DetailsTable
VALUES (@X,1, 'XXXXX') SET
@X=@X+1
END
SET @X=1
WHILE @X <9
BEGIN
INSERT INTO @DetailsTable
VALUES (@X, 2, 'XXXXX') SET
@X=@X+1
END
SELECT D.* FROM @DetailsTable as D INNER JOIN @MasterTable AS M ON M.MasterID = D.MasterID
UNION ALL
SELECT TOP (10 - ISNULL(NULLIF((SELECT COUNT(*)
FROM @DetailsTable as D INNER JOIN AS M ON M.MasterID = D.MasterID) % 10, 0), 10))
(SELECT MAX(ID) FROM @DetailsTable as D INNER JOIN @MasterTable AS M ON M.MasterID = D.MasterID)+n, NULL, NULL
FROM (VALUES(1), (2),(3), (4),(5),
(6),(7), (8),(9), (10)) A(n)
结果
ID MasterID _Text
1 1 XXXXX
2 1 XXXXX
3 1 XXXXX
4 1 XXXXX
5 1 XXXXX
6 1 XXXXX
1 2 XXXXX
2 2 XXXXX
3 2 XXXXX
4 2 XXXXX
5 2 XXXXX
6 2 XXXXX
7 2 XXXXX
8 2 XXXXX
9 NULL NULL
10 NULL NULL
11 NULL NULL
12 NULL NULL
13 NULL NULL
14 NULL NULL
尝试以下方法:
DECLARE @MasterTable TABLE(MasterID INT)
INSERT INTO @MasterTable
VALUES(1),(2)
DECLARE @DetailsTable TABLE (ID INT, MasterID INT, _Text NVARCHAR(255))
DECLARE @X INT=1
WHILE @X <7
BEGIN
INSERT INTO @DetailsTable VALUES (@X,1, 'XXXXX')
SET @X+=1
END
SET @X=1
WHILE @X <9
BEGIN
INSERT INTO @DetailsTable VALUES (@X, 2, 'XXXXX')
SET @X+=1
END
DECLARE @TEMP TABLE (M_ID INT)
DECLARE @ID INT
INSERT @TEMP SELECT DISTINCT MasterID FROM @MASTERTABLE
WHILE ((SELECT COUNT(1) FROM @TEMP) > 0)
BEGIN
SET @ID = (SELECT TOP 1 M_ID FROM @TEMP)
INSERT @DETAILSTABLE
SELECT TOP (10 - ISNULL(NULLIF((SELECT COUNT(*) FROM @DETAILSTABLE WHERE MASTERID = @ID) % 10, 0), 10))
(SELECT MAX(ID) FROM @DETAILSTABLE WHERE MasterID = @ID)+n, @ID, NULL
FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) A(n)
DELETE @TEMP WHERE M_ID = @ID
END
SELECT * FROM @DETAILSTABLE ORDER BY MasterID, ID
HTH!
谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.