Transact-SQL: объединение двух таблиц с необязательными атрибутами соединения в таблице 2 - PullRequest
0 голосов
/ 18 сентября 2018

У меня проблемы с определением оператора Transact-SQL (SQL Server) для следующей ситуации: Есть 2 таблицы 1 и 2, каждая из которых имеет идентификатор (первичный ключ) и 3 атрибута A, B, C. ВВ Таблице 1 все атрибуты являются обязательными, в Таблице 2 обязательным является только А.

Это означает, что в Таблице 2 представлены более или менее конкретные записи.

Я хочу объединить эти две таблицы.найдя наиболее конкретную запись таблицы 2 для записей таблицы 1

enter image description here Я надеюсь, что следующая картина является понятным описанием проблемы:

IЯ пытался объединить, следуя инструкциям case, но всегда получал синтаксические ошибки.

Чтобы указать проблему: Мой первый подход состоял в том, чтобы определить выражение объединения с помощью ON Case, как это, что, конечно, не работает, но:

  SELECT * FROM Table T1
     JOIN Table T2 ON CASE
        WHEN T1.A = T2.A AND T1.B=T2.B AND T1.C=T2.C
        THEN T1.A = T2.A AND T1.B=T2.B AND T1.C=T2.C
        WHEN T1.A = T2.A AND T1.B=T2.B AND T1.C!=T2.C
        THEN T1.A = T2.A AND T1.B=T2.B
        WHEN T1.A = T2.A AND T1.B!=T2.B AND T1.C!=T2.C
        THEN T1.A = T2.A
        ELSE 0 

Поэтому мне нужен только подход, а не целое решение для него.

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете объединять таблицы с одинаковыми атрибутами, рассматривая пустые символы как символы подстановки.

Затем используйте оконную функцию row_number, чтобы получить наилучшее совпадение для идентификатора Table1 ID

SELECT ID1, ID2
FROM
(
    SELECT t1.ID AS ID1, t2.ID AS ID2
    , ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY (IIF(t2.AttributeA IS NULL,0,1) + IIF(t2.AttributeB IS NULL,0,1) + IIF(t2.AttributeC IS NULL,0,1)) DESC, t2.AttributeA DESC, t2.AttributeB DESC, t2.AttributeC DESC) AS rn
    FROM Table1 AS t1
    LEFT JOIN Table2 AS t2
       ON ((t2.AttributeA = t1.AttributeA OR t2.AttributeA IS NULL) AND
           (t2.AttributeB = t1.AttributeB OR t2.AttributeB IS NULL) AND
           (t2.AttributeC = t1.AttributeC OR t2.AttributeC IS NULL))
) q
WHERE rn = 1
ORDER BY ID1;

Вы можете проверить SQL на rextester здесь

...