2015-08-06 2 views
2
SELECT ItemID, Name 
FROM tblItem 
WHERE ItemID IN (4, 38, 39, 37, 16, 8, 15,14) 

Используя приведенный выше запрос SQL, я получаю ниже набор результатов, который упорядочен по ItemID.SQL-запрос без указания по

Я хочу, чтобы результирующий набор не был заказами или с каким-либо эффектом сортировки.

4 Item1 
8 Item2 
14 Item3 
15 Item4 
16 Item5 
37 Item6 
38 Item7 
39 Item8 
+3

@Tanner: Заказ по умолчанию не установлен. Данные захватываются как можно быстрее и могут быть в порядке индекса, но это не предсказуемо. –

+0

упомянутый запрос возвращает данные в том порядке, в котором строки были вставлены, следовательно, индексированы по id –

+2

@MachMitch: данные будут возвращены в порядок, в котором он найден. Порядок внесения данных не имеет значения. – Guffa

ответ

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

Запрос будет просто возвращать элементы по мере их нахождения. ДБ (вероятно, индексы и реализация db могут повлиять на это) начнутся с самого начала и проработают через таблицу, сравнивая каждую из них с этим списком. Если они совпадают с одним из itemIds в списке, он добавит его в resultSet. Скорее всего, они добавляются в db по порядку (генерируются ItemIds), поэтому сначала вы получите самые низкие. Но у вас нет гарантии, что так будет.

+0

есть ли способ избежать по умолчанию Order By, я хочу показать результирующий набор, как указано в разделе IN –

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); 
+0

, есть ли способ избежать по умолчанию Order By, я хочу показать набор результатов, как указано в разделе IN –

+0

I обновленный запрос.Попробуйте, работает ли он или нет. – SNC

+0

Этот метод известен как общее выражение таблицы (CTE). – SNC

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; 
0

Если не указать порядок, порядок произвольно. Рассмотрим отдельную таблицу или общее выражение таблицы, которое включает SortOrder. Дополнительным преимуществом является синтаксис JOIN, позволяющий сохранить действие SET-BASED, в то время как оператор CASE заставит ваш запрос перейти по строке-агонизирующей строке (RBAR). Лучше этого будет иметь порядок сортировки и идентификаторы элементов в их собственной таблице, поэтому вам не нужно создавать 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 
Смежные вопросы