TSQL ORDER-BY с UNION разрозненных наборов данных
У меня есть запрос, что UNIONs два несколько похожих набора данных, но оба они имеют некоторые столбцы, которые не присутствуют в другом - то есть столбцы имеют значения NULL в результате UNION. Целью UNION является получение данных в дружественном формате для программного обеспечения.
Проблема в том, что мне нужно ЗАКАЗАТЬ полученные данные, используя те столбцы, которые существуют только в одном или другом наборе.
Например: Таблица 1 имеет поля ID, Cat, Price. Таблица 2 имеет идентификаторы полей (такие же, как в таблице 1), Name, Abbrv.
Мой запрос выглядит примерно так:
SELECT t1.ID, t1.Cat, t1.Price, NULL as Name, NULL as Abbrv FROM t1
UNION
SELECT t2.ID, NULL as Cat, NULL as Price, t2.Name, t2.Abbrv FROM t2
ORDER BY Price DESC, Abbrv ASC
ORDER BY - это место, где я застрял. Данные выглядят следующим образом:
100---Balls-----1.53----------------------
200---Bubbles---1.24----------------------
100---------------------RedBall----101RB--
100---------------------BlueBall---102BB--
200---------------------RedWand----201RW--
200---------------------BlueWand---202BW--
Но я хочу, чтобы это выглядело так:
100---Balls-----1.53----------------------
100---------------------RedBall----101RB--
100---------------------BlueBall---102BB--
200---Bubbles---1.24----------------------
200---------------------RedWand----201RW--
200---------------------BlueWand---202BW--
(извинения, если их трудно читать - не знали, как еще показать таблицу)
Имейте в виду, что это очень глупый пример, а пресловутый "использует JOIN!". ответ не применим (т.е. я уже знаю, как присоединяться к ним, но это не то, что я хочу в конечном результате).
Вполне возможно, что единственный способ достичь этого - манипулировать данными в программном обеспечении, когда он возвращается с уровня данных - если это так, то и так. Но я надеюсь, что это можно сделать в TSQL.
Ответы
Ответ 1
Select ID, Cat, Price, Name, Abbrv
From
(SELECT t1.ID, t1.Cat, t1.Price, t1.Price AS SortPrice, NULL as Name, NULL as Abbrv
FROM t1
UNION
SELECT t2.ID, NULL as Cat, NULL as Price, t1.Price as SortPrice, t2.Name, t2.Abbrv
FROM t2
inner join t1 on t2.id = t1.id
) t3
ORDER BY SortPrice DESC, Abbrv ASC
Как-то вы должны знать, что данные в таблице 2 связаны с таблицей 1 и разделяют цену. Поскольку Null in abbrv будет первым, нет необходимости создавать столбец SortAbbrv.
Ответ 2
Вы должны использовать UNION ALL вместо UNION, чтобы сохранить стоимость двойной проверки.
SELECT *
FROM
(
SELECT t1.ID, t1.Cat, t1.Price, NULL as Name, NULL as Abbrv FROM t1
UNION ALL
SELECT t2.ID, NULL as Cat, NULL as Price, t2.Name, t2.Abbrv FROM t2
) as sub
ORDER BY
ID,
CASE WHEN Price is not null THEN 1 ELSE 2 END,
Price DESC,
CASE WHEN Abbrv is not null THEN 1 ELSE 2 END,
Abbrv ASC
Ответ 3
Быстрое решение заключалось бы в том, чтобы сделать 2 вставки в временную таблицу или переменную таблицы и как часть вставки в таблицу temp вы можете установить столбец флага, чтобы помочь в сортировке, а затем упорядочить по столбцу этого флага.
Ответ 4
В верхней части моей головы я бы сказал, что худшим сценарием является создание временной таблицы со всеми полями. INSERT INTO в таблице temp из T1 и T2, затем SELECT из таблицы temp с порядком.
т. Создайте временную таблицу (например, #temp) с полями Id, Cat, Price, Name, Abbrv, а затем:
SELECT Id, Cat, Price, null, null INTO #temp FROM T1
SELECT Id, null, null, Name, Abbrv INTO #temp FROM T2
SELECT * FROM #temp ORDER BY Id, Price DESC, Abbrv ASC
NB: я не уверен на 100% от нулевого синтаксиса от вставок, но думаю, что он будет работать.
EDIT: добавлено упорядочение по цене и Abbrv после id... если Id не связывает T1 и T2, то что делает?