Sql 如何获取表数据间隙中缺少的值

Sql 如何获取表数据间隙中缺少的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,如何填补表格的空白。我有一个样本数据 DECLARE @Table TABLE ( Rule_ID VARCHAR(10), Name VARCHAR(10), Age INT ) INSERT INTO @Table(Rule_ID,Name,Age) VALUES ('Rule_01','Mohan',29), ('Rule_01','Manasa',25), ('Rule_03','Raju',29), ('Rule_03','Miju',25), ('Rule_

如何填补表格的空白。我有一个样本数据

DECLARE @Table TABLE 
( Rule_ID VARCHAR(10),
  Name    VARCHAR(10),
  Age     INT
)
INSERT INTO @Table(Rule_ID,Name,Age) 
VALUES
('Rule_01','Mohan',29),
('Rule_01','Manasa',25),
('Rule_03','Raju',29),
('Rule_03','Miju',25),
('Rule_05','Ramu',30),
('Rule_05','Rao',35)

Select * from @Table
当前结果集

规则\u ID姓名年龄

Rule_01 Mohan   29
Rule_01 Manasa  25
Rule_03 Raju    29
Rule_03 Miju    25
Rule_05 Ramu    30
Rule_05 Rao 35
Rule_01 Mohan   29
Rule_01 Manasa  25
Rule_02 NULL    NULL
Rule_03 Raju    29
Rule_03 Miju    25
Rule_04 NULL    NULL
Rule_05 Ramu    30
Rule_05 Rao     35
我想要这样的输出

规则\u ID姓名年龄

Rule_01 Mohan   29
Rule_01 Manasa  25
Rule_03 Raju    29
Rule_03 Miju    25
Rule_05 Ramu    30
Rule_05 Rao 35
Rule_01 Mohan   29
Rule_01 Manasa  25
Rule_02 NULL    NULL
Rule_03 Raju    29
Rule_03 Miju    25
Rule_04 NULL    NULL
Rule_05 Ramu    30
Rule_05 Rao     35

我从堆栈溢出中尝试了很多答案。但我无法前进。建议我

规则\u ID
执行。使用
规则\u ID
的最后两位数字

DECLARE @Table TABLE 
( Rule_ID VARCHAR(10),
  Name    VARCHAR(10),
  Age     INT
)
INSERT INTO @Table(Rule_ID,Name,Age) 
VALUES
('Rule_01','Mohan',29),
('Rule_01','Manasa',25),
('Rule_03','Raju',29),
('Rule_03','Miju',25),
('Rule_05','Ramu',30),
('Rule_05','Rao',35)

DECLARE @MaxValue INT
SELECT @MaxValue = MAX(CAST(RIGHT(Rule_ID, 2) AS INT)) from @Table

DECLARE @Id INT = 1
;WITH Tmp (Id)
AS 
(
    SELECT @Id AS Id
    UNION ALL
    SELECT Id +1 FROM Tmp
    WHERE
        Id < @MaxValue      
)

SELECT * FROM @Table
UNION ALL
SELECT 'Rule_' + RIGHT('00' + CAST(A.Id AS NVARCHAR(2)), 2), NULL, null FROM Tmp A
WHERE
    NOT EXISTS
    (
        SELECT TOP 1 1 FROM @Table T
        WHERE
            T.Rule_ID = 'Rule_' + RIGHT('00' + CAST(A.Id AS NVARCHAR(2)), 2)
    )
ORDER BY Rule_ID

删除
规则\u ID
。使用
规则\u ID
的最后两位数字

DECLARE @Table TABLE 
( Rule_ID VARCHAR(10),
  Name    VARCHAR(10),
  Age     INT
)
INSERT INTO @Table(Rule_ID,Name,Age) 
VALUES
('Rule_01','Mohan',29),
('Rule_01','Manasa',25),
('Rule_03','Raju',29),
('Rule_03','Miju',25),
('Rule_05','Ramu',30),
('Rule_05','Rao',35)

DECLARE @MaxValue INT
SELECT @MaxValue = MAX(CAST(RIGHT(Rule_ID, 2) AS INT)) from @Table

DECLARE @Id INT = 1
;WITH Tmp (Id)
AS 
(
    SELECT @Id AS Id
    UNION ALL
    SELECT Id +1 FROM Tmp
    WHERE
        Id < @MaxValue      
)

SELECT * FROM @Table
UNION ALL
SELECT 'Rule_' + RIGHT('00' + CAST(A.Id AS NVARCHAR(2)), 2), NULL, null FROM Tmp A
WHERE
    NOT EXISTS
    (
        SELECT TOP 1 1 FROM @Table T
        WHERE
            T.Rule_ID = 'Rule_' + RIGHT('00' + CAST(A.Id AS NVARCHAR(2)), 2)
    )
ORDER BY Rule_ID

如果事先知道(即已修复)不同的规则ID,并且您没有应该存在的不同规则ID的源,则获得所需结果的一种方法是使用如下方法:

SELECT Rules.Rule_ID, t.Name, t.Age 
FROM (
    VALUES ('Rule_01'),('Rule_02'),('Rule_03'),('Rule_04'),('Rule_05')
) AS Rules (Rule_ID)   
LEFT JOIN @Table t ON t.Rule_ID = Rules.Rule_ID

这对于固定数据来说很好,但是如果规则ID的范围取决于表中的数据,并且您希望填补最低和最高数字之间的差距,那么另一种解决方案可能会更好。

如果事先知道不同的规则ID,则获得您想要的结果的一种方法(即固定)您没有不同规则的源,应该存在的规则ID是使用如下的:

SELECT Rules.Rule_ID, t.Name, t.Age 
FROM (
    VALUES ('Rule_01'),('Rule_02'),('Rule_03'),('Rule_04'),('Rule_05')
) AS Rules (Rule_ID)   
LEFT JOIN @Table t ON t.Rule_ID = Rules.Rule_ID
SELECT tally.Rule_ID ,Name ,  Age
FROM (
    SELECT TOP(99) Rule_ID='Rule_' + left('0'+cast(row_number() over (order by (select null)) as varchar(2)), 2)
    FROM sys.all_objects ) AS tally
LEFT JOIN @Table t ON t.Rule_ID = tally.Rule_ID
这对于固定数据很好,但是如果规则ID的范围取决于表中的数据,并且您希望填补最低和最高数字之间的空白,那么另一种解决方案可能更好。

是检查和生成序列的一种很好的方法。是检查和生成序列的好方法。
SELECT tally.Rule_ID ,Name ,  Age
FROM (
    SELECT TOP(99) Rule_ID='Rule_' + left('0'+cast(row_number() over (order by (select null)) as varchar(2)), 2)
    FROM sys.all_objects ) AS tally
LEFT JOIN @Table t ON t.Rule_ID = tally.Rule_ID