2015-06-10 6 views
2

у меня есть таблица со следующим типом:Как заказать результат на основе значений столбцов в SQL сервере

Id Parent_id Code Name  market 
1 NULL  1ex name 1  3 
2 1   2ex name 2  3 
3 1   3ex name 3  3 
4 Null  4ex name 4  1 
5 null  5ex name 5  3 
6 4   6ex name 6  3 

Я хотел выбрать code и name из приведенных выше таблиц, так что он заказал в следующим образом:

  1. на основе рынка, где рынок ID = 3
  2. родитель идентификатор
  3. родственный ребенка
  4. другие

ie. Сначала должен отображаться идентификатор 1 (Parent_id), за которым следует id 2 и 3 (дочерний идентификатор). Значения в 'parent_id' находятся в столбце 'id'.

Я до сих пор строил следующий запрос, и мне немного сложно заказать родительский код и связанные с ним дочерние коды.

select code,name from tbl_codes A 
order by CASE WHEN(A.[Market] = 3) THEN 0 ELSE 1 END 

Может кто-то, пожалуйста, помогите мне.

+0

попробуйте это. Выберите код, имя от tbl_codes A где market = 3 order by Id, Parent_id? –

ответ

1

Рекурсивный CTE является лучшим способом построить родительскую/дочернюю иерархию следующим образом:

-- Set up test data 
CREATE TABLE tbl_codes (id INT , Parent_id INT, Code VARCHAR(3), NAME VARCHAR(12), Market INT) 
INSERT tbl_codes 
SELECT 1, NULL, '1ex', 'name 1', 3 UNION ALL 
SELECT 2, 1 , '2ex', 'name 2', 3 UNION ALL 
SELECT 3, 1 , '3ex', 'name 3', 3 UNION ALL 
SELECT 4, NULL , '4ex', 'name 4', 1 UNION ALL 
SELECT 5, NULL , '5ex', 'name 5', 3 UNION ALL 
SELECT 6, 4 , '6ex', 'name 6', 3 

CREATE VIEW [dbo].[View_ParentChild] 
AS 
-- Use a recursive CTE to build a parent/child heirarchy 
WITH 
    RecursiveCTE AS 
    (
    SELECT 
     id, 
     name, 
     parent_id, 
     Code, 
     market, 
     sort = id 
    FROM 
     tbl_codes 
    WHERE 
     parent_id IS NULL 
    UNION ALL 
    SELECT 
     tbl_codes.id, 
     tbl_codes.name, 
     tbl_codes.parent_id, 
     tbl_codes.Code, 
     tbl_codes.market, 
     sort = tbl_codes.parent_id 
    FROM 
     tbl_codes 
     INNER JOIN RecursiveCTE 
     ON tbl_codes.parent_id = RecursiveCTE.id 
    WHERE 
     tbl_codes.parent_id IS NOT NULL 
) 
    SELECT 
    Code, 
    NAME, 
    Market, 
    Sort 
    FROM 
    RecursiveCTE 

GO 

По вашему запросу я рефакторинг запрос как VIEW.

Чтобы использовать вид:

SELECT 
    * 
FROM 
    dbo.View_ParentChild AS vpc 
ORDER BY 
    CASE WHEN (Market = 3) THEN 0 
     ELSE 1 
    END, 
    sort 

Это дает следующий результат:

Code NAME Market Sort 
    ---- ------ ------ ---- 
    1ex  name 1  3  1 
    2ex  name 2  3  1 
    3ex  name 3  3  1 
    6ex  name 6  3  4 
    5ex  name 5  3  5 
    4ex  name 4  1  4 

Чтобы узнать больше о рекурсивных КТР нажмите here

И, как и требовалось, это новая версия вид, который не использует рекурсивный КТЭ

CREATE VIEW [dbo].[View_ParentChild_v2] 
AS 
SELECT 
    id, 
    Code, 
    market, 
    sort 
FROM 
(
    SELECT 
    id, 
    name, 
    parent_id, 
    Code, 
    market, 
    sort = id 
    FROM 
    tbl_codes 
    WHERE 
    parent_id IS NULL 

    UNION ALL 

    SELECT 
    tbl_codes.id, 
    tbl_codes.name, 
    tbl_codes.parent_id, 
    tbl_codes.Code, 
    tbl_codes.market, 
    sort = tbl_codes.parent_id 
    FROM 
    tbl_codes 
    WHERE 
    tbl_codes.parent_id IS NOT NULL 
) AS T 

GO 

Используется следующим образом:

SELECT 
    * 
FROM 
    View_ParentChild_v2 
ORDER BY 
    CASE WHEN (Market = 3) THEN 0 
     ELSE 1 
    END, 
    sort 

NB: первая версия, с помощью рекурсивного ОТВ, может обрабатывать практически неограниченные уровни Parent/Child, а версия 2 обрабатывает только один уровень.

+0

Привет! большое спасибо!! это то, что я ожидал! но затем уточнить, можно ли это использовать в представлении? потому что мое приложение вызвало бы представление, чтобы отобразить эти коды, и порядок должен быть сделан на вид. Пожалуйста, предложите – bl1234

+0

Рефакторинг как представление.NB: «ПРОСМОТР» не может иметь предложение «ORDER BY». Просто сделайте свой заказ вне представления. – JohnS

+0

Hi JohnS !! Благодаря тонну!! Это получилось отлично! – bl1234

0

Вы можете положить условие в свои столбцы. Попробуйте:

SELECT code , 
     name , 
     CASE WHEN (A.[Market] = 3) THEN 0 
      ELSE 1 
     END AS marketOrder , 
     CASE WHEN (parent_id = 1) THEN 0 
      ELSE 1 
     END AS parentOrder 
FROM tbl_codes A 
ORDER BY parentOrder , 
     marketOrder 
2

Попробуйте

SELECT code , 
     name 
FROM tbl_codes A 
ORDER BY CASE WHEN (A.[Market] = 3) THEN 0 
      ELSE 1 
     END , 
     CASE WHEN (ISNULL(parent_id,0) = 1) THEN 0 
      ELSE 1 
     END 
+0

Спасибо за ваш ответ! Но parent_id не является 1 всегда. Например, мне нужно сделать так, чтобы были указаны коды всех родительских идентификаторов, за которыми следуют дочерние идентификаторы – bl1234

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