【问题标题】:SQL Sort by multiple columns of a different tableSQL 按不同表的多列排序
【发布时间】:2021-07-08 06:21:22
【问题描述】:

我有两张桌子: 第一个有列:

|Name | Company | Job|

具有诸如

之类的值
(jack apple developer),
(Julian google developer),
(Jim eBay developer),
(jack apple janitor),
(Julian google janitor),
(Jim eBay janitor),
(jack apple manager),
(Julian google manager),
(Jim eBay manager) 

第二个表由姓名和工作的排序顺序和列组成

|FilterVal | Name_Sort_Order | Job_Sort_Order|** and Values


(jack,2, NULL),
(Julian, 1, NULL),
(Jim, 3, NULL),
(Janitor, NULL, 1),
(Manager, NULL, 3),
(Developer, NULL, 2)

如何按第二个表的 name_sort_order 和 job_sort_order 对第一个表进行排序? 期望的结果:

(Julian google janitor),
(Julian google developer),
(Julian google manager),
(jack apple janitor),
(jack apple developer),
(jack apple manager),
(Jim eBay janitor),
(Jim eBay developer),
(Jim eBay manager)

【问题讨论】:

  • 您能否编辑您的问题以使其更具可读性?
  • 希望粗体有所帮助。对不起第一次使用

标签: mysql sql nosql mariadb


【解决方案1】:

嗯。 . .一种方法使用order by 中的子查询:

select t1.*
from table1 t1 
order by (select t2.name_sort_order
          from table2 t2
          where t2.filterval = t.name and t2.name_sort_order is not null
         ),
         (select t2.job_sort_order
          from table2 t2
          where t2.filterval = t.job and t2.job_sort_order is not null
         );

【讨论】:

    【解决方案2】:

    您可以加入第二张表两次(基于“FilterVal”列),然后按顺序排序。这里的关键是给第二个表起别名。

    WITH A AS(
            SELECT 'jack' Name, 'apple' Company, 'Developer' Job FROM DUAL
            UNION ALL
            SELECT 'Julian' Name, 'google' Company, 'Developer' Job FROM DUAL
            UNION ALL
            SELECT 'Jim' Name, 'eBay' Company, 'Developer' Job FROM DUAL
            UNION ALL
            SELECT 'jack' Name, 'apple' Company, 'Janitor' Job FROM DUAL
            UNION ALL
            SELECT 'Julian' Name, 'google' Company, 'Janitor' Job FROM DUAL
            UNION ALL
            SELECT 'Jim' Name, 'eBay' Company, 'Janitor' Job FROM DUAL
            UNION ALL
            SELECT 'jack' Name, 'apple' Company, 'Manager' Job FROM DUAL
            UNION ALL
            SELECT 'Julian' Name, 'google' Company, 'Manager' Job FROM DUAL
            UNION ALL
            SELECT 'Jim' Name, 'ebay' Company, 'Manager' Job FROM DUAL
            ) , B AS (
            SELECT 'jack' FilterVal, 2 NameSortOrder, NULL Job_Sort_Order FROM DUAL
            UNION ALL
            SELECT 'Julian' FilterVal, 1 NameSortOrder, NULL Job_Sort_Order FROM DUAL
            UNION ALL
            SELECT 'Jim' FilterVal, 3 NameSortOrder, NULL Job_Sort_Order FROM DUAL
            UNION ALL
            SELECT 'Janitor' FilterVal, NULL NameSortOrder, 1 Job_Sort_Order FROM DUAL
            UNION ALL
            SELECT 'Manager' FilterVal, NULL NameSortOrder, 3 Job_Sort_Order FROM DUAL
            UNION ALL
            SELECT 'Developer' FilterVal, NULL NameSortOrder, 2 Job_Sort_Order FROM DUAL
    )
    SELECT
            A.Name
            ,A.Company
            ,A.Job
    FROM
        A LEFT OUTER JOIN B ON A.Name = B.FilterVal AND B.NameSortOrder IS NOT NULL
        LEFT OUTER JOIN B AS BB ON A.Job = BB.FilterVal AND BB.Job_Sort_Order IS NOT NULL
    ORDER BY
        B.NameSortOrder, BB.Job_Sort_Order;
    

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多