2

我在编写查询时有点难过(SQL 不是我的强项)。

说我有以下内容TABLE1

CODE NAME     SCOPE1  SCOPE2    SEQ
------------------------------------
A    a        Here              1
B    b        Here              2
C    c        Here              3
C    c                Room      1
A    aa               Room      2
B    bbb              Room      3

业务关键是CODE + SCOPE1 + SCOPE2, whereSCOPE1SCOPE2总是相互排斥的。

鉴于我需要按、CODE和排序,我怎样才能得到不同的结果?NAMESCOPE1SCOPE2SEQ

也就是说,给定SCOPE1 = 'Here'and SCOPE2 = 'Room',我想得到这个结果:

CODE NAME
---------
A    a
B    b
C    c
A    aa
B    bbb

注意:C cfrom是不想要的,因为它是 to fromRoom的副本。C cHere

我确实意识到使用DISTINCTwith的局限性,ORDER BY我能想到的最好的方法如下:

select distinct CODE, NAME from
(
    select CODE, NAME from MYTABLE
    where (SCOPE1='Here' or SCOPE2='Room')
    order by SCOPE1, SCOPE2, SEQ
);

以上产生了正确的对,但顺序错误。我试着弄乱GROUP BY,但我想我知道的还不够。

我必须坚持使用标准 SQL(也就是说,没有特定于产品的 SQL 构造,除非它可能是 Oracle),而且我想对于这个特定的查询,可能无法避免子选择。

我将非常感谢任何指示。提前致谢。

更新:我已经更新了数据集,并根据彼得姆的回答,这是我目前所拥有的:sqlfiddle。当我开始调整序列时,MIN/MAX 技巧不起作用。

假设是我将始终搜索一个特定SCOPE1的与一个特定的配对SCOPE2。但我需要所有SCOPE1记录都出现在之前SCOPE2。这个想法是我不在乎是CODE + NAME来自SCOPE1还是SCOPE2- 我只想要按 , 和 排序的SCOPE1唯一SCOPE2SEQ

4

1 回答 1

5

更新基于您对 Oracle 的更新要求

SELECT CODE, NAME
  FROM
(
  SELECT CODE, NAME, 
         ROW_NUMBER() OVER (ORDER BY SCOPE1, SCOPE2, SEQ) rnum
    FROM Table1
   WHERE SCOPE1='Here' 
      OR SCOPE2='Room'
) q 
 GROUP BY CODE, NAME
 ORDER BY MIN(rnum)

这是SQLFiddle

使其在 SQL Server 中以相同的方式工作

SELECT CODE, NAME
  FROM
(
  SELECT CODE, NAME, 
         ROW_NUMBER() OVER (ORDER BY CASE WHEN SCOPE1 IS NULL 
                                          THEN 1 ELSE 0 END, SCOPE1,
                                     CASE WHEN SCOPE2 IS NULL 
                                          THEN 2 ELSE 3 END, SCOPE2, SEQ) rnum
    FROM Table1
   WHERE SCOPE1='Here' 
      OR SCOPE2='Room'
) q 
 GROUP BY CODE, NAME
 ORDER BY MIN(rnum)

这是SQLFiddle

输出:

| 代码 | 姓名 |
---------------
| 一个 | 一个 |
| 乙| 乙 |
| C | c |
| 一个 | 啊 |
| 乙| bbb |

原始答案:根据您对要求的描述,我唯一能想到的

SELECT CODE, NAME
  FROM Table1
 WHERE SCOPE1='Here' 
    OR SCOPE2='Room'
 GROUP BY CODE, NAME
 ORDER BY MIN(SCOPE1), MIN(SCOPE2), MIN(SEQ)

这是SQLFiddle演示 (MySql)
这是SQLFiddle演示 (SQL Server)
这是SQLFiddle演示 (Oracle)

现在默认情况下在 MySql 和 SQL Server 中NULL首先运行,因此您将得到

| 代码 | 姓名 |
---------------
| 乙| bbb |
| 一个 | 一个 |
| 乙| 乙 |
| C | c |

默认情况下,在 OracleNULL中最后一个因此你会得到

| 代码 | 姓名 |
---------------
| 一个 | 一个 |
| 乙| 乙 |
| C | c |
| 乙| bbb |
于 2013-07-04T16:00:35.223 回答