Вот мой сценарий: у меня есть две таблицы A, B, которые (ради этого вопроса идентичны):
Таблица X (PK)
ID
1
2
Таблица A:
ID FKID Value Sort
1 1 a 1
2 1 aa 2
3 1 aaa 3
4 2 aaaa 1
5 2 aaaaa 2
Таблица B:
ID FKID Value Sort
1 1 b 1
2 1 bb 2
3 2 bbb 1
4 2 bbbb 2
5 2 bbbbb 3
Желаемый вывод:
FKID ValueA ValueB Sort
1 a b 1
1 aa bb 2
1 aaa (null) 3
2 aaaa bbb 1
2 aaaaa bbbb 2
2 (null) bbbbb 3
Итак, запись 1 имеет 3-As и 2-B, а запись 2 имеет 2-As и 3-B, все они хорошо спарены столбцом целых чисел Sort.
Мое текущее решение заключается в перекрестном соединении с таблицей чисел. Это работает, но, поскольку количество элементов в этих таблицах не ограничено, моя таблица чисел довольно большая (приложение теоретически не ограничено, но практически я могу ограничить его до 1000).
Я мог бы также сгенерировать таблицу чисел с функцией и подзапросом, но это еще хуже для производительности (я знаю, мне нужно это проверить!).
Итак, я подумал: возможно, есть лучший способ решить эту проблему? Я надеюсь на счастливую среду между тем, где я сейчас нахожусь, и объединением таблиц.
Еще одна вещь: Я застрял на SQL Server 2000 : P.
Обновление: Добавлена таблица PK выше, чтобы уточнить, что я искал. Я также исправил желаемый результат. Извини за это.
Обновление: Полное решение:
DECLARE @X AS TABLE (ID INT)
DECLARE @A AS TABLE (ID INT, FKID INT, Value VARCHAR(10), Sort INT)
DECLARE @B AS TABLE (ID INT, FKID INT, Value VARCHAR(10), Sort INT)
INSERT INTO @X (ID) VALUES (1)
INSERT INTO @X (ID) VALUES (2)
INSERT INTO @A (ID, FKID, Value, Sort) VALUES (1, 1, 'a', 1)
INSERT INTO @A (ID, FKID, Value, Sort) VALUES (2, 1, 'aa', 2)
INSERT INTO @A (ID, FKID, Value, Sort) VALUES (3, 1, 'aaa', 3)
INSERT INTO @A (ID, FKID, Value, Sort) VALUES (4, 2, 'aaaa', 1)
INSERT INTO @A (ID, FKID, Value, Sort) VALUES (5, 2, 'aaaaa', 2)
INSERT INTO @B (ID, FKID, Value, Sort) VALUES (1, 1, 'b', 1)
INSERT INTO @B (ID, FKID, Value, Sort) VALUES (2, 1, 'bb', 2)
INSERT INTO @B (ID, FKID, Value, Sort) VALUES (3, 2, 'bbb', 1)
INSERT INTO @B (ID, FKID, Value, Sort) VALUES (4, 2, 'bbbb', 2)
INSERT INTO @B (ID, FKID, Value, Sort) VALUES (5, 2, 'bbbbb', 3)
SELECT * FROM @X
SELECT * FROM @A
SELECT * FROM @B
SELECT COALESCE(A.FKID, B.FKID) ID
,A.Value
,B.Value
,COALESCE(A.Sort, B.Sort) Sort
FROM @X X
LEFT JOIN @A A ON A.FKID = X.ID
FULL OUTER JOIN @B B ON B.FKID = A.FKID AND B.Sort = A.Sort