是否可以订购第一个查询并保留首先返回的行,而不是订购第二个查询。 (如果那样的话)
我目前的调查的一个例子是:
SELECT
*
FROM
Devices
WHERE
Live = 'true'
AND Category = 'apple'
ORDER BY
ListOrder
UNION
SELECT
*
FROM
Devices
WHERE
DeviceLive = 'true'
我希望apple类别下的设备按照列表顺序进行组织,并且位于其他设备上方列表的顶部。但这似乎将两个问题混杂在一起。
答案 0 :(得分:16)
您需要引入人工排序键。类似的东西:
SELECT
*, 1 as SortKey
FROM
Devices
WHERE
Live = 'true'
AND Category = 'apple'
UNION
SELECT
*, 2 as SortKey
FROM
Devices
WHERE
DeviceLive = 'true'
ORDER BY SortKey, ListOrder
答案 1 :(得分:5)
UNION
具有隐式重复数据删除功能。这意味着使用它的副作用是一切都混杂在一起,因为它的排序将发生。它(通常,但不总是)意味着你得到排序输出(参见下一段)。
UNION ALL
删除了这一点,但是,仍然需要注意的是,没有明确order by
的查询输出无法保证排序。这已被另一个答案所涵盖,但我认为值得指出其重要性。
答案 2 :(得分:3)
你可以假装它
SELECT col1, col2 ...
FROM (
SELECT 1 fake_order, col1, col2 ... FROM Devices WHERE Live ='true' AND Category='apple' ORDER BY ListOrder
UNION ALL
SELECT 2, col1, col2 ... FROM Devices WHERE DeviceLive ='true'
) AS T
ORDER BY fake_order
(未经测试的SQL在我的头顶)
答案 3 :(得分:0)
我从Joe Stefanelli那里得到了答案,但稍微修改了一下:
嗨,我不需要制作人工排序键,我只是确保每个表都具有我想要排序的列的相同名称。就我而言,列名是“order”。所以我做了:
Select *, order as uOrder from table 1
UNION
select *, order as uOrder from table 2
ORDER BY uOrder