Эту проблему можно решить, создав две дополнительные таблицы (временные или нет, в зависимости от ваших требований и механизма SQL), структура которых будет отображать столбцы из запроса.
Например:
CREATE TABLE TableA (
Col1 int,
Col2 bit,
Col3 varchar(4),
Col4 varchar(4)
)
CREATE TABLE TableB (
Col1 int,
Col2 bit,
Col3 varchar(4),
Col4 varchar(4)
)
Обратите внимание, что это только примерная структура, основанная на представленных вами выходных данных.
После создания этих двух таблиц вам потребуется вставить данные из запроса в каждую из таблиц.
Добавлено:
Вам не нужно выполнять один и тот же запрос дважды. Выполните его один раз, поместите данные в TableA, затем выполните SELECT для TableA и поместите данные в TableB. Это сэкономит вам много времени.
Последним шагом будет выполнение запроса к TableA и TableB с JOIN для их столбцов Col3 и Col4. Примерно так:
SELECT A.Col1, A.Col2, B.Col1, B.Col2, COALESCE(A.Col3, B.Col3), COALESCE(A.Col4, B.Col4)
FROM TableA A INNER JOIN TableB B ON A.Col3 = B.Col3 AND A.Col4 = B.Col4
Надеюсь, это поможет.
Также имейте в виду, что у этого решения есть один существенный недостаток:
Если вы измените количество столбцов или их тип данных в оригинальном запросе, вам также придется обновить определения таблиц.
Возможным решением этой проблемы будет использование динамического SQL, но обычно это не рекомендуется.
После редактирования (вы предоставили дополнительные NULLS в выходных данных):
Если вы хотите сохранить значения NULL, вам следует использовать другое объединение, например: LEFT OUTER JOIN
Другие возможные решения:
Просто замените (SELECT * FROM dbo.Test) длинным запросом.
Однако это приведет к тому, что запрос будет выполнен дважды.
ВЫБРАТЬ A. *, B. * ИЗ (ВЫБРАТЬ * ИЗ dbo.Test) ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ * ИЗ dbo.Test) B ВКЛ A.Col3 = B.Col3 AND A.Col4 = B.Col4 AND A.Col1 <> B.Col1 И A.Col2 <> B.Col2
Если вы используете SQL 2005, вы можете попробовать использовать оператор CROSS APPLY.
Могут быть и другие решения, но вы должны более подробно описать используемый движок SQL и свои права на базу данных.