Я ищу способ архивировать следующее:
Представьте себе таблицы A, B:
A:
aID, aID2, avalue
=================
1 , 10 , 'abc'
2 , 20 , 'def'
3 , 30 , 'ghi'
4 , 40 , 'jkl'
B
bID, bID2, bvalue
=================
1 , 10 , 'mno'
20 , 20 , 'pqr'
3 , 1 , 'stu'
Теперь посмотрите на следующий оператор SQL и результаты (я нахожусь на Oracle 11, но должен быть таким же для MSSQL):
ВЫБРАТЬ A. *, B. * ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B ВКЛЮЧЕНО (A.aID = B.bID)
aID, aID2, avalue, bID , bID2, bvalue
=====================================
1 , 10 , 'abc' , 1 , 10 , 'mno'
2 , 20 , 'def' , NULL, NULL, NULL
3 , 30 , 'ghi' , 3 , 1 , 'stu'
4 , 40 , 'jkl' , NULL, NULL, NULL
ВЫБРАТЬ A. *, B. * ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B ВКЛЮЧИТЬ (A.aID = B.bID И A.aID2 = B.bID2)
aID, aID2, avalue, bID , bID2, bvalue
=====================================
1 , 10 , 'abc' , 1 , 10 , 'mno'
2 , 20 , 'def' , NULL, NULL, NULL
3 , 30 , 'ghi' , NULL, NULL, NULL
4 , 40 , 'jkl' , NULL, NULL, NULL
Пока хорошо.
Я ищу заявление (настолько простое, насколько это возможно), которое дает мне следующее:
MADE-UP-CODE: ВЫБЕРИТЕ A. *, B. * ИЗ ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ B ВКЛЮЧЕНО (A.aID = B.bID И A.aID2 = B.bID2 ПРОДОЛЖАЙТЕ СОХРАНИТЬ СОБЫТИЯ COLS)
aID, aID2, avalue, bID , bID2, bvalue
=====================================
1 , 10 , 'abc' , 1 , 10 , 'mno'
2 , 20 , 'def' , NULL, 20 , NULL (note 20)
3 , 30 , 'ghi' , 3 , NULL, NULL (note 3)
4 , 40 , 'jkl' , NULL, NULL, NULL
Есть ли способ получить такое поведение (сохранить совпадающие части, NULL не совпадают части предложения "ON" и все столбцы значений), используя только объединения, не используя самосоединения снова и снова?
Как бы вы предложили, если бы не существовал ключевой мир, такой как "KEEP MATCHING COLS"?
Подзапрос? Selfjoins
Спасибо,
Blama