2015-03-21 8 views
1

Мой SQL позорно ржавый. Я думал, что это дело для INTERSECT, но я хочу убедиться.SQL Intersect или Left Присоединиться к подзапросу? Таблица споров/исправлений

У меня есть две таблицы. enter image description here

Таблица 1 содержит целую кучу строк, которые поступают из фида. Мы не контролируем их, и любые поправки к их значениям будут отменены, когда фид отправит новые данные. Некоторые данные неверны, поэтому Table2 действует как таблица Disputes или Corrections. Если поля Attribue1, Attribute2, Attribute3 определенной строки в таблице 1 неверны, строка создается в таблице 2 с «правильными» значениями для этих полей. Я могу связать две таблицы с помощью внешнего ключа (MatchKey1 на моем снимке).

В основном я хочу получить все строки из таблицы 1, но с исправлениями Таблицы 2, если они существуют, как будто это была вся одна таблица с «правильной» информацией для начала. Поскольку Table2 не удаляется, исправления будут сохраняться, когда таблица обновлений обновляет таблицу 1 до тех пор, пока между двумя таблицами может быть создана ссылка.

Пример:

Таблица 1

* Строка 1: {1, 00A1, желтый, рыбы, днем}

Строка 2: {2, 00A2, красный, корова, Sad } *

Таблица 2

Строка 1: {00A1, зеленый, Са т, Happy}

Запрос будет производить:

* {1, 00A1, зеленый, Cat, Happy}

{2, 00A2, красный, корова, Сад} *

Строка 2 в таблице 1 остается, как и значение «Happy» (Attribute3) в Row1, но значения Attribute1 и Attribute2 показывают «скорректированные» значения.

Если не INTERSECT, будет ли какая-то левая регистрация (возможно, с подзапросом) лучше?

Select * Table1 Left Регистрация Table2 на Table1.Matchkey1 = Table2.MatchKey1

Я хочу, чтобы исключить «неправильные» значения полей из столбцов одного и того же имени в Table1, хотя.

справка приветствуется.

ответ

1

Вы можете справиться с этой ситуацией с помощью простого COALESCE высказывания и LEFT JOIN (например, в оракула или db2):

SELECT Table1.PrimaryKeyID 
    , Table1.MatchKey1 
    , COALESCE(Table2.Attribute1, Table1.Attribute1) AS Attribute1 
    -- and so on 
FROM Table1 
LEFT JOIN 
Table2 
ON Table2.MatchKey1=Table1.MatchKey1 

Если COALESCE не доступен в вашем диалекте, используйте CASE WHEN ... IS NULL THEN ... ELSE ... END вместо этого. Обратите внимание, что этот запрос предполагает, что каждое поле в Table2 заполняется, когда JOIN был успешным - в противном случае вы можете иметь смеси атрибутов обеих таблиц (например,, Attribute1 и Attribute2 от Table2 и Attribute3 от Table1) - это может также быть желательным.