繁体   English   中英

SQL在主表中的每个记录的详细信息表中添加空行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM