#mysql #sql-server
Вопрос:
Основываясь на изображении, ТАБЛИЦА B-моя основная таблица, в то время как ТАБЛИЦА A-это правила или условия для ТАБЛИЦЫ B.
Я хочу написать запрос таким образом, чтобы при выполнении правила 1 в таблице A, которое обозначает столбец [C1], имеющий показатель 3. Затем найдите соответствующее имя столбца в ТАБЛИЦЕ B с соответствующим значением и замените значение ЗАПОЛНЕНИЯ. Результат, который я хотел получить, похож на ТАБЛИЦУ C.
Как я могу это сделать?
Комментарии:
1. Я не понимаю — почему только строки 2 и 3 получают обновленную заливку?
2. потому что в строке 2 есть 3 в c1 и 6 в c2, которые соответствуют показателю в таблице A.
Ответ №1:
Вам просто нужно присоединиться на основе OR
условия для обоих столбцов
Предпочтительно агрегировать с MAX
на всякий случай, если есть несколько совпадений
SELECT b.c1, b.c2, ISNULL(a.fill, b.fill) AS fill FROM TableB b OUTER APPLY ( SELECT MAX(fill) AS fill FROM TableA a WHERE a.[column] = 'c1' AND b.c1 = a.ind OR a.[column] = 'c2' AND b.c2 = a.ind ) a;
Ответ №2:
Вы можете достичь этого с помощью pivot
. Изменение имен столбцов в таблице А из строк в столбцы.
select B.c1,B.c2, (CASE WHEN A.ind IS NULL THEN 0 ELSE 1 END) AS fill from tblB AS B left outer join (select * from ( select [column], ind, fill from tblA ) src pivot ( max(fill) for [column] in ([c1], [c2]) ) piv ) AS A ON (B.c1 = A.ind or B.c2 = A.ind)