SELECT ItemID, Name
FROM tblItem
WHERE ItemID IN (4, 38, 39, 37, 16, 8, 15,14)
通过使用上面给出的SQL查询,我得到的结果集是由ItemID按顺序排列的。
我希望结果集没有Order By或任何排序效果。
4 Item1
8 Item2
14 Item3
15 Item4
16 Item5
37 Item6
38 Item7
39 Item8
答案 0 :(得分:2)
要按特定顺序获取项目,您必须按这种方式对其进行排序。以特定顺序指定in
语句中的值不会使数据库按此顺序获取它们。 in
语句中的值将以某种方式处理,例如排序或放入哈希集,以便它们可以与索引匹配或在表扫描中使用。保持原始顺序的项目只会使查询变慢。
您可以使用case
将身份转换为排序:
select
ItemID, Name
from
tblItem
where
ItemID in (4, 38, 39, 37, 16, 8, 15,14)
order by
case ItemID
when 4 then 1
when 38 then 2
when 39 then 3
when 37 then 4
when 16 then 5
when 8 then 6
when 15 then 7
when 14 then 8
end
答案 1 :(得分:1)
查询将只返回找到的项目。数据库将(可能是索引和数据库实现可能会影响这一点)从一开始就开始,并通过表格将它们与列表进行比较。如果它们与列表中的itemId之一匹配,则会将其添加到resultSet中。可能性是它们按顺序添加到数据库中(生成ItemIds),因此您将首先获得最低的数据。但你无法保证会出现这种情况。
答案 2 :(得分:1)
如果您想要in
子句(或其他任何内容)指定的结果集,则需要执行order by
。
执行此操作的一种方法是使用VALUES
子句和join
:
SELECT i.ItemID, i.Name
FROM tblItem iJOIN
(VALUES(4, 1), (38, 2), (39, 3), (37, 4), (16, 5), (8, 6), (15, 7), (14, 8)
) ids(id, priority)
ON i.ItemId = ids.id
ORDER BY ids.priority;
答案 3 :(得分:0)
试试这个:
With item_ids as
(select item_id from tblitem
where item_id IN (4,8,9....))
select * from item_ids
where item_id <(select max(item_id) from item_ids) or
item_id=(select max(item_id) from item_ids);
答案 4 :(得分:0)
如果您没有指定订单,则订单是任意的。 考虑一个单独的表或公用表表达式,其中包括一个SortOrder。 另一个好处是JOIN语法允许您保持基于SET的操作,而CASE语句将强制您的查询逐行(RBAR)。比这更好的是将排序顺序和项目ID放在他们自己的表中,这样你就不必动态创建CTE。这是CTE版本:
;with SortOrder (ItemID,Sort)
as (
select 4, 1
union select 38,2
union select 39,3
union select 37,4
union select 16,5
union select 8,6
union select 15,7
union select 14,8
)
select tblItem.ItemID
, tblItem.Name
from tblItem
join SortOrder
on SortOrder.ItemID = tblItem.ItemID
order by SortOrder.Sort