Я пытаюсь объединить две таблицы вместе. Первая таблица содержит записи данных, которые я не хочу дублировать. Во второй таблице я присоединяюсь к первой таблице для поиска [значения] с помощью различных [profileId] и [role]. Столбец [profileId], [role] во второй таблице имеет уникальное ограничение для комбинации, но [role] иногда может быть NULL, и в этом случае я рассматриваю это значение как значение по умолчанию для этого профиля.SQL JOIN with COALESCE в состоянии дублирует строки
Как объединить эти таблицы без дублирования строк и без использования нескольких левых соединений? Мой фактический запрос более сложный, чем пример.
См. Пример ниже.
DECLARE @temp TABLE ([profileId] int, [role] int)
DECLARE @temp2 TABLE ([profileId] int, [role] int, [value] nvarchar(50))
INSERT INTO @temp ([profileId], [role]) VALUES (1, 1)
INSERT INTO @temp ([profileId], [role]) VALUES (1, 2)
INSERT INTO @temp ([profileId], [role]) VALUES (2, 1)
INSERT INTO @temp ([profileId], [role]) VALUES (2, 2)
INSERT INTO @temp2 ([profileId], [role], [value]) VALUES (1, 1, 'MATCH')
INSERT INTO @temp2 ([profileId], [role], [value]) VALUES (1, NULL, 'DEFAULT1')
INSERT INTO @temp2 ([profileId], [role], [value]) VALUES (2, NULL, 'DEFAULT2')
SELECT
T1.[profileId],
T1.[role],
T2.value
FROM
@temp T1
JOIN @temp2 T2 ON T1.profileId = T2.profileId AND COALESCE(T2.[role], T1.[role]) = T1.[role]
Это дает мне (и я понимаю, почему)
================================
| profileId | role | value |
================================
| 1 | 1 | MATCH |
--------------------------------
| 1 | 1 | DEFAULT1 |
--------------------------------
| 1 | 2 | DEFAULT1 |
--------------------------------
| 2 | 1 | DEFAULT2 |
--------------------------------
| 2 | 2 | DEFAULT2 |
================================
В то время как я хочу
================================
| profileId | role | value |
================================
| 1 | 1 | MATCH |
--------------------------------
| 1 | 2 | DEFAULT1 |
--------------------------------
| 2 | 1 | DEFAULT2 |
--------------------------------
| 2 | 2 | DEFAULT2 |
================================
Ваше значение по умолчанию находится в базе данных или вы можете использовать 'CASE' для его получения? –
Будет ли несколько NULL 'role' в' @ temp2'? –
@FelixPamittan Да, в соответствии с комментарием в моем ответе. Существует также некоторый 'profileID' –