2013-04-21 4 views
1

Предположим, я получил таблицу tbl1 (C1, C2, C3)Как запросить пользовательский порядок сортировки, который хранился в другой таблице?

C1-C2-C3
А - 2 - 6
Н - 6 - 7
С - 9 - 4
К - 3 - 5

& другая таблица OrderOfTbl1 (С1, customOrder INT)

С1 - customOrder К - 1
Н - 2
С - 3
А - 4

Теперь я могу делать все вроде запроса на tbl1 & результат может быть любой заказ
Н - 6
А - 2
K - 3

Итак, как сделать этот результат отсортированным как Заказ, указанный в таблице OrderOfTbl1?

Я не хочу делать Соединение между этими двумя столами, я предпочитаю «Заказ по делу .... Тогда ...», так как это более естественно.

ответ

2

Использование соединения - ваш лучший выбор. Тем не менее, если вы хотите, чтобы избежать вступления в явном виде, вы можете сделать это:

SELECT t.* 
FROM table1 t 
ORDER BY (SELECT customOrder FROM orderoftbl1 ot WHERE t.c1 = ot.c1) 

Требование для этого работы является то, что SELECT внутри ORDER BY вернулся скаляр.

+0

Ваш запрос совершенный, он очень прост и элегантен. Thax u очень много – Tom

+0

да, orderoftbl1 содержат скалярные значения – Tom

1

Правильный способ сделать это с помощью объединения:

select t.* 
from table1 t left outer join 
    orderoftbl1 ot 
    on t1.c1 = ot.c1 
order by ot.customerOrder 

Вы можете использовать case заявление, когда у вас есть константы:

select * 
from table1 
order by (case when c1 = 'K' then 1 
       when c1 = 'N' then 2 
       . . . 
      end) 

Но что поражения цели с другой таблицы ,

Что вы подразумеваете под «решением, поскольку оно более естественно»? Что делает один оператор SQL «более естественным», чем другой?

Вы могли бы сделать то, что вы хотите использовать связанный подзапрос в предложении order by:

select * 
from table1 t1 
order by (select customerOrder from orderoftbl1 ot where ot.c1 = t1.c1) 

Однако почти никто не будет считать это «проще» или «более естественным», чем версия с join. На самом деле, некоторые базы данных могут не поддерживать коррелированный подзапрос в предложении order by. До этого ответа я, конечно, никогда не писал такой SQL.

+0

Предположим, что Tbl1 присоединился к множеству разных таблиц, и если мы используем решение 1, тогда запрос будет сложным. – Tom

+0

Я хочу иметь простой запрос, например «Выбрать * из tbl1 order by (выберите C1, customOrder из OrderOfTbl1) что-то например, но я не знаю запроса – Tom

+0

, если вам нужно заказать много полей: заказ c1, c2, c3.c4 .... , тогда это будет слишком сложно, если вы используете Left join – Tom

Смежные вопросы