SQL Server: вставьте пропущенные строки - PullRequest
0 голосов
/ 15 октября 2019

Используя пример кода ниже, как я могу добавить отсутствующий Param для каждого EntityId без использования WHILE? В конце я хочу для каждого EntityId строку для Param 1, Param 2 и Param 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 ]

3 голосов
/ 15 октября 2019

С CROSS JOIN из @Param и различными EntityId с @Data и LEFT JOIN до @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].

0 голосов
/ 15 октября 2019

Если вы хотите выбрать 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)
0 голосов
/ 15 октября 2019

Обратите внимание на мои комментарии.

-- 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...