SQL Server:插入缺少的行

时间:2019-10-15 18:15:36

标签: sql-server tsql

使用下面的代码示例,如何在不使用WHILE的情况下为每个EntityId添加缺少的Param?最后,我要为每个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')

3 个答案:

答案 0 :(得分:3)

其中CROSS JOIN的{​​{1}}和@Param的不同EntityId@DataLEFT JOIN

@Data

请参见demo
我不确定您是否要像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]

答案 1 :(得分:0)

注意我的评论。

-- 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;

答案 2 :(得分:0)

如果您想选择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)
相关问题