Sql server SQL Server:插入缺少的行

Sql server SQL Server:插入缺少的行,sql-server,tsql,Sql Server,Tsql,使用下面的代码示例,如何在不使用WHILE的情况下为每个EntityId添加缺少的参数?最后,我希望每个EntityId都有一行参数1、参数2和参数3。我正在使用SQL Server 2012 DECLARE @Data TABLE ( ID INT IDENTITY(1,1), EntityId INT, [Param] VARCHAR(25), [Value] VARCHAR(25) ) DECLARE @Param TABLE ( [Param]

使用下面的代码示例,如何在不使用WHILE的情况下为每个EntityId添加缺少的参数?最后,我希望每个EntityId都有一行参数1、参数2和参数3。我正在使用SQL Server 2012

DECLARE @Data TABLE
(
    ID INT IDENTITY(1,1),
    EntityId INT,
    [Param] VARCHAR(25),
    [Value] VARCHAR(25)
)

DECLARE @Param TABLE
(
    [Param] VARCHAR(25)
)

INSERT INTO @Param([Param]) VALUES ('Param 1')
INSERT INTO @Param([Param]) VALUES ('Param 2')
INSERT INTO @Param([Param]) VALUES ('Param 3')

INSERT INTO @Data (EntityId, [Param], [Value]) VALUES(1, 'Param 1', 'Value 1')
INSERT INTO @Data (EntityId, [Param], [Value]) VALUES(1, 'Param 2', 'Value 2')
INSERT INTO @Data (EntityId, [Param], [Value]) VALUES(1, 'Param 3', 'Value 3')

INSERT INTO @Data (EntityId, [Param], [Value]) VALUES(2, 'Param 1', 'Value 1')
INSERT INTO @Data (EntityId, [Param], [Value]) VALUES(2, 'Param 3', 'Value 3')

INSERT INTO @Data (EntityId, [Param], [Value]) VALUES(3, 'Param 1', 'Value 1')
INSERT INTO @Data (EntityId, [Param], [Value]) VALUES(3, 'Param 3', 'Value 3')

INSERT INTO @Data (EntityId, [Param], [Value]) VALUES(4, 'Param 1', 'Value 1')

使用
@Param
交叉连接
@Data
的独特
实体ID
s以及
@Data
的左连接

INSERT INTO @Data (EntityId, [Param])
  SELECT e.EntityId, p.[Param]
  FROM @Param p 
  CROSS JOIN (SELECT DISTINCT EntityId FROM @Data) AS e
  LEFT JOIN @Data d ON d.EntityId = e.EntityId AND d.[Param] = p.[Param]
  WHERE d.EntityId IS NULL
请参阅。
我不确定您是否希望列
[Value]
中填充值,就像
[Param]

注意我的注释一样

-- 1. SAMPLE DATA
DECLARE @Data TABLE
(
    ID INT IDENTITY(1,1),
    EntityId INT,
    [Param] VARCHAR(25),
    [Value] VARCHAR(25)
);

DECLARE @Param TABLE
(
    [Param] VARCHAR(25)
);

INSERT INTO @Param([Param]) 
VALUES ('Param 1'),('Param 2'),('Param 3')

INSERT INTO @Data (EntityId, [Param], [Value]) 
VALUES(1, 'Param 1', 'Value 1'),(1, 'Param 2', 'Value 2'),(1, 'Param 3', 'Value 3'),
(2, 'Param 1', 'Value 1'),(2, 'Param 3', 'Value 3'),(3, 'Param 1', 'Value 1'),
(3, 'Param 3', 'Value 3'),(4, 'Param 1', 'Value 1');

-- 2. How to get ALL values
SELECT
  dist.EntityId,
  p.[Param],
  [Value] = REPLACE(p.[Param], 'Param','Value')
FROM
(
  SELECT DISTINCT d.EntityId
  FROM @data AS d -- OR WHEREEVER I CAN GET A DISTINCT LIST OF EntityIDs
) AS dist(EntityId)
CROSS JOIN @param AS p;
-- 3. How to identify MISSING values
SELECT
  dist.EntityId,
  [Param] = CAST(p.[Param] AS varchar(25)),
  [Value] = CAST(REPLACE(p.[Param], 'Param','Value') AS varchar(25))
FROM
(
  SELECT DISTINCT d.EntityId
  FROM @data AS d -- OR WHEREEVER I CAN GET A DISTINCT LIST OF EntityIDs
) AS dist(EntityId)
CROSS JOIN @param AS p
EXCEPT 
SELECT d.EntityId, d.[param], d.[value]
FROM @data AS d;

-- 4. How to add missing values
INSERT @data
SELECT
  dist.EntityId,
  [Param] = CAST(p.[Param] AS varchar(25)),
  [Value] = CAST(REPLACE(p.[Param], 'Param','Value') AS varchar(25))
FROM
(
  SELECT DISTINCT d.EntityId
  FROM @data AS d -- OR WHEREEVER I CAN GET A DISTINCT LIST OF EntityIDs
) AS dist(EntityId)
CROSS JOIN @param AS p
EXCEPT 
SELECT d.EntityId, d.[param], d.[value]
FROM @data AS d;

如果要选择要插入哪些记录的EntityId,则可以选择它

declare @eId int
set @eId = 4

insert into @Data (EntityId, [Param], [Value]) 
    select @eId, [Param], 'Value ' + CAST(RIGHT([Param],1) AS varchar(1)) 
    from @Param 
    where [Param] NOT IN (select [Param] from @Data where EntityId = @eId)

您的源数据是什么?您的预期输出是什么?