Заказ пользовательского результата с использованием UNION – TSQL
У меня довольно простая задача, в которой мне нужно выбрать строки с определенным полем со значением 1 сначала, а затем значением 2 и, наконец, все остальные строки со значением 0.
Я использую соединение, чтобы получить, какие элементы являются членами какой категории. Я думал, что выполнение 3 выбора и использование объединения будет сочетаться с результатами в правильном порядке, но я ошибся 🙂
Мой SQL выглядит следующим образом:
- Неоднозначное имя столбца при выборе из нескольких таблиц
- Внутреннее объединение двух таблиц на основе всех пар «Key / Value», соответствующих точно
- Проблема с дизайном таблицы базы данных
- Как получить все имена столбцов без одного столбца в таблице sql в SQL Server
- Каковы плюсы и минусы различных способов создания ограничения в SQL?
SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 1 UNION SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 2 UNION SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 0
Мои результаты не выходят с 1, затем 2, а затем 0 .. Что я тут делаю неправильно?
* РЕШЕНИЕ * Спасибо за помощь ребятам. Ниже приведен последний SQL, который я использую.
SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category ORDER BY CASE tblcompany.intpremium WHEN 1 THEN 0 WHEN 2 THEN 1 WHEN 0 THEN 2 END
- Новая таблица или запятая?
- Создать список дат, основанный на дне и наступлении месяца
- Какие критерии необходимы для приравнивания полей?
- Как вы обманываете неизвестные?
- Вставка данных в базу данных не может понять
- Ограничение на таблицу для ограничения количества сохраняемых записей
- Что делает COLLATE SQL_Latin1_General_CP1_CI_AS?
- Как хранить конфиденциальные данные разных клиентов на SQL-сервере?
Оператор UNION, как и все хорошие операторы набора, является агностическим, когда дело доходит до упорядочения данных.
Однако вы можете выполнить один оператор select с помощью тщательно продуманного оператора ORDER BY, например:
... ORDER BY CASE tblCompany.IntPremium WHEN 1 THEN 0 WHEN 2 THEN 1 WHEN 0 THEN 2 END
Заказ не выполняется по порядку ваших операторов select в предложении union. Самое простое – добавить заказ:
SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 1 UNION SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 2 UNION SELECT * FROM tblcompanycategory INNER JOIN tblcompany ON tblcompany.idcompany = tblcompanycategory.idcompany WHERE tblcompanycategory.idcategory = @category AND tblcompany.intpremium = 0 ORDER BY CASE intpremium WHEN 1 THEN 1 WHEN 2 THEN 2 WHEN 0 THEN 3 END
Вам нужно будет добавить столбец в три оператора select с литеральным значением, которое «классифицирует» результаты. Затем заказывайте по этой колонке.