Найти измененные строки (составной ключ с нулями) - PullRequest
1 голос
/ 16 января 2012

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

Первичный ключ (на самом деле он не определен как первичный ключ, просто то, что мы знаем, идентифицирует уникальную строку) является составным, состоящим из множества внешних ключей. Примерно около 15, большинство из которых могут иметь значения NULL. Для простоты предположим, что первичный ключ состоит из этих трех ключевых столбцов и имеет 2 поля значений, которые необходимо сравнить:

CREATE TABLE SourceTable 
(
    Key1 int NOT NULL,
    Key2 nvarchar(10),
    Key3 int,
    Value1 nvarchar(255),
    Value2 int
)

Если Key1 = 1, Key2 = NULL и Key3 = 4. Тогда я бы хотел сравнить его со строкой в ​​target, которая имеет точно такие же значения в ключевых полях. Включая NULL в ключе 2.

Поля значений также могут иметь значения NULL.

Так какой же лучший подход использовать при разработке таких запросов, когда значения NULL следует рассматривать как реальные значения и сравнивать? НУЛЕВОЙ? COALESCE? Перекрыть

Есть предложения?

Ответы [ 2 ]

1 голос
/ 16 января 2012

Нули плохо воспроизводятся с внешними ключами: изменение нуля на значение не приведет (в SQL Server) к каскаду при обновлении.

Лучше всего избегать нулевого значения (и по многим другим причинам!) Вместо этого попросите администратора баз данных назначить другое «магическое» значение того же типа данных, но за пределами типа домена. Примеры: DATE: значение даты в далеком или далеком будущем. INTEGER: ноль или отрицательное значение. VARCHAR: значение в двойных фигурных скобках для обозначения значения метаданных, например, '{{NONE}}', '{{UNKNOWN}}', '{{NA}}' и т. Д., А затем ограничение CHECK, чтобы гарантировать, что значения не могут начинаться / заканчиваться двойными фигурными скобками.

В качестве альтернативы, модель пропускает информацию из-за отсутствия кортежа в relvar (предположение о замкнутом мире);)

1 голос
/ 16 января 2012

ANSI SQL имеет конструкцию IS [NOT] DISTINCT FROM, которая еще не была реализована в SQL Server ( Запрос соединения ).

Можно имитировать эту функцию в SQL Server, используя, однако, EXCEPT / INTERSECT. Оба из них рассматривают NULL как равные в сравнении. Вы хотите найти строки, в которых ключевые столбцы совпадают, но столбцы значений отличаются. Так что это должно сделать это.

SELECT *
FROM   SourceTable S
       JOIN DestinationTable D
         ON S.Key1 = D.Key1
            /*Join the key columns on equality*/
            AND NOT EXISTS (SELECT S.Key2,
                                   S.Key3
                            EXCEPT
                            SELECT D.Key2,
                                   D.Key3)  
             /*and the value columns on unequality*/
            AND NOT EXISTS (SELECT S.Value1,
                                   S.Value2
                            INTERSECT
                            SELECT D.Value1,
                                   D.Value2)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...