объединение таблиц так, что незаписанные данные становятся нулевыми вместо нулевых - PullRequest
0 голосов
/ 01 мая 2018

У меня есть набор данных для пользователей за минуту в течение часа, который включает только ненулевые записи, я хотел бы обновить таблицу, чтобы она включала все менуэты. В настоящее время мой первый хотел бы, если бы я вставил его вместо импортированного:

`

 CREATE TABLE table1 (minute INT NOT NULL, users INT NOT NULL);
     INSERT INTO table1 (minute, users) VALUES (32,1);
     INSERT INTO table1 (minute, users) VALUES (40,1);
     INSERT INTO table1 (minute, users) VALUES (41,1);
     INSERT INTO table1 (minute, users) VALUES (51,1);
     INSERT INTO table1 (minute, users) VALUES (52,1);

`

Я бы хотел, чтобы 55 других минут в час показывались вместе с пользователями a 0. диапазон составляет (0-59)

в помощь, что я создал вторую таблицу

`

 CREATE TABLE m_fix
    (minute INT NOT NULL, users INT NOT NULL); 
    INSERT INTO m_fix (minute, users) VALUES (0,0);
    INSERT INTO m_fix (minute, users) VALUES (1,0);
    INSERT INTO m_fix (minute, users) VALUES (2,0);
    INSERT INTO m_fix (minute, users) VALUES (3,0);......

`

Мне удалось сделать выборочное объединение для отображения информации, которую я хотел, с этим кодом:

`

SELECT
     m_fix.minute,
     Case
     When table1.users IS NULL THEN m_fix.users
     ELSE table1.users
     END AS users
     FROM m_fix
     LEFT JOIN table1 ON m_fix.minute=table1.minute;

`

Но я хочу обновить мою таблицу1 вместо того, чтобы выполнять запрос, поскольку в конечном итоге я собираюсь экспортировать эти данные в другое место. Для этого я сделал этот код:

`

INSERT INTO dbo.table1
 SELECT dbo.fix.minute, dbo.fix.users
 FROM dbo.fix
 LEFT JOIN dbo.table1
 ON dbo.fix.minute=dbo.table1.minute
 Where dbo.fix.minute!= dbo.table1.minute;
 Select * From dbo.table1;

`

и это просто у меня моя старая таблица 1 с 5 строками

Это только мой тестовый пример, у меня на несколько дней больше данных для обработки, поэтому я хотел бы, чтобы мне было приказано запускать каждую новую импортируемую таблицу, которая добавляет все отсутствующие менуэты с user = 0

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы хотите вставить те минуты, которые не существуют в вашей таблице, что напрямую переводится как:

INSERT INTO dbo.table1
 SELECT fix.minute, users
 FROM dbo.fix
 WHERE NOT EXISTS
  (
    SELECT * 
    FROM dbo.table1
    WHERE dbo.fix.minute=dbo.table1.minute -- same minute
  )

И выбор можно упростить с помощью COALESCE, если вы хотите, чтобы они все равно были равны нулю:

SELECT
   m_fix.minute,
   COALESCE(table1.users, 0) AS users
FROM m_fix
LEFT JOIN table1
ON m_fix.minute=table1.minute;
0 голосов
/ 01 мая 2018

Так как NULL не равен NULL, ваше предложение WHERE непреднамеренно фильтрует данные, которые вы пытаетесь получить.

Изменить этот раздел:

 SELECT dbo.fix.minute, dbo.fix.users
 FROM dbo.fix
 LEFT JOIN dbo.table1
 ON dbo.fix.minute=dbo.table1.minute
 Where dbo.fix.minute!= dbo.table1.minute;

К этому:

 SELECT dbo.fix.minute, dbo.fix.users
 FROM dbo.fix
 LEFT JOIN dbo.table1
 ON dbo.fix.minute=dbo.table1.minute
 Where dbo.table1.minute IS NULL;
...