2016-10-04 2 views
1

У меня есть таблица old_data и таблица new_data. Я хочу написать отборное заявление, что дает мнеselect sql query для объединения результатов

  1. Ряды в old_data пребывания там
  2. Новые строки в new_data добавляются в old_data
  3. уникальный ключ id так строки с id в new_data должны обновить существующие в old_data

Мне нужно написать инструкцию select, которая даст мне old_data обновленный с новыми данными и новыми данными, добавленными к нему.

Пример:

Таблица А:

id   count 

1    2 
2   19 
3    4 

Таблица б:

id   count 

2   22 
5    7 

мне нужно ЗЕЬЕСТ, что дает мне

id   count 

1    2 
2   22 
3    4 
5    7 
+1

Какую именно СУБД вы используете. 'MERGE' служит для этой цели –

+0

Я не хочу использовать конструкцию db. Что-то вроде соединения - то, что мне нужно – gags

ответ

2

Основываясь на ваших желаемых результатов :

 SELECT 
      * 
     FROM 
      [TableB] AS B 
     UNION ALL 
     SELECT 
      * 
     FROM 
      [TableA] AS A 
     WHERE 
      A.id NOT IN (SELECT id FROM [TableB]) 
+0

О, нет, нет. Это не максимальная вещь. Просто обновленные данные из новой таблицы для заданного id – gags

+0

@gags OK, Изменен ответ, см. Этот. –

+0

Этот запрос даст мне все из таблицы B, которая не была в таблице A. В этом примере он никогда не будет обновлять строку 2 со значением счета 22 вместо 19 – gags

2

Я думаю, что это будет работать очень аккуратно с COALESCE:

SELECT a.id, COALESCE(b.count, a.count) 
FROM a 
FULL OUTER JOIN b 
ON a.id = b.id 

Примечание - если ваша РСУБД не содержит COALESCE, вы можете написать свою функцию, используя СЛУЧАЙ следующим образом:

SELECT a.id, 
CASE WHEN b.count IS NULL THEN a.count 
ELSE b.count END AS count 
FROM ... 

Вы можете написать FULL OUTER JOIN следующим образом:

SELECT * 
FROM a 
LEFT JOIN b 
ON a.id = b.id 
UNION ALL 
SELECT * 
FROM b 
LEFT a 
ON b.id = a.id 
+1

Это должно быть «полное внешнее соединение» –

+0

Вы правы @Prdp. Благодаря! – kbball

+0

Но он не поддерживается в 'Mysql' OP хочет, чтобы код работал во всех sql-диалектах. –

0

Вы должны использовать UPSERT для обновления старых данных и добавления новых данных в таблицу Old_data и выбора всех строк из Old_data. Проверьте и дайте мне знать, что вы думаете про этот вопрос.

UPDATE [old_data] 
SET [count] = B.[count] 
FROM [old_data] AS A 
INNER JOIN [new_Data] AS B 
ON A.[id] = B.[id] 

INSERT INTO [old_data] 
      ([id] 
      ,[count]) 
SELECT A.[id] 
    ,A.[count] 
FROM [new_Data] AS A 
LEFT JOIN [old_data] AS B 
ON A.[id] = B.[id]  
WHERE B.[id] IS NULL 

SELECT * 
FROM [old_data]