Oracle SQL order by Dons';t对多列进行排序

Oracle SQL order by Dons';t对多列进行排序,sql,oracle,oracle11g,oracle12c,Sql,Oracle,Oracle11g,Oracle12c,我有一个表student,我想对其中的三列进行排序:first\u name,last\u name,street\u address。我期待这样的结果: | first_name | last_name | street_address | A A 100 Carroll St B B 200 Carroll St C C 300 Carroll St

我有一个表
student
,我想对其中的三列进行排序:
first\u name,last\u name,street\u address
。我期待这样的结果:

| first_name | last_name | street_address |

     A            A        100 Carroll St
     B            B        200 Carroll St
     C            C        300 Carroll St
| first_name | last_name        | street_address            |

     A         C (not sorted)       300 Carroll St  (not sorted)
     B         B (not sorted)       100 Carroll St  (not sorted)
     C         A (not sorted)       200 Carroll St  (not sorted)
这是我的SQL查询:

SELECT first_name, last_name, street_address
FROM student
ORDER BY first_name, last_name, street_address;
但此查询的排序如下:

| first_name | last_name | street_address |

     A            A        100 Carroll St
     B            B        200 Carroll St
     C            C        300 Carroll St
| first_name | last_name        | street_address            |

     A         C (not sorted)       300 Carroll St  (not sorted)
     B         B (not sorted)       100 Carroll St  (not sorted)
     C         A (not sorted)       200 Carroll St  (not sorted)
此查询没有按预期工作。它不会按升序对所有列进行排序,它只对order BY之后出现的第一列进行排序。如上所述,查询只对
first\u name
列进行排序。如果我在ORDER BY之后更改列的位置,它只会在“ORDER_BY”之后对第一个提到的列进行排序

我搜索过谷歌和很多论坛,没有找到任何与这个问题相关的东西

Oracle版本:

Oracle数据库12c企业版12.2.0.1.0版-64位生产0

PL/SQL版本12.2.0.1.0-生产0

核心12.2.0.1.0生产0

用于64位Windows的TNS:12.2.0.1.0版-生产0

NLSRTL版本12.2.0.1.0-生产0


非常感谢您的帮助。

您提出的查询不会给出您所说的结果。你会得到的是

A   A   100 Carroll St
B   B   200 Carroll St
C   C   300 Carroll St
使用以下查询

WITH student AS (SELECT 'A' AS FIRST_NAME, 'A' AS LAST_NAME, '100 Carroll St' AS STREET_ADDRESS FROM DUAL UNION ALL
                 SELECT 'B', 'B', '200 Carroll St' FROM DUAL UNION ALL
                 SELECT 'C', 'C', '300 Carroll St' FROM DUAL)
SELECT first_name, last_name, street_address
FROM student
ORDER BY first_name, last_name, street_address
我建议你回去看看表中的实际数据,这可能不是你所期望的


祝你好运。

你给出的查询不会给出你所说的结果。你会得到的是

A   A   100 Carroll St
B   B   200 Carroll St
C   C   300 Carroll St
使用以下查询

WITH student AS (SELECT 'A' AS FIRST_NAME, 'A' AS LAST_NAME, '100 Carroll St' AS STREET_ADDRESS FROM DUAL UNION ALL
                 SELECT 'B', 'B', '200 Carroll St' FROM DUAL UNION ALL
                 SELECT 'C', 'C', '300 Carroll St' FROM DUAL)
SELECT first_name, last_name, street_address
FROM student
ORDER BY first_name, last_name, street_address
我建议你回去看看表中的实际数据,这可能不是你所期望的


祝你好运。

以下是一些示例输入数据,我希望这将使以下解释更清楚:

id  | first_name | last_name    | street_address         
 10 | Albert     |  Camus       | 300 Carroll St 
 20 | Caroline   |  Aherne      | 200 Carroll St 
 30 | Bertoldt   |  Brecht      | 500 Carroll St  
 40 | Albert     |  Dumbledore  | 400 Carroll St 
 50 | Bertoldt   |  Brecht      | 100 Carroll St  
这里我们有五条记录,它们告诉我们有用的东西,比如阿尔伯特·加缪住在卡罗尔街300号,卡罗琳·埃亨住在卡罗尔街200号。了解SQL查询的重要一点是它检索记录;当我们使用ORDER BY时,它对记录进行排序,而不是对单个列进行排序

因此,当我们按照名、姓、街道地址对这些记录进行排序时,我们得到以下结果:

id  | first_name | last_name    | street_address         
 10 | Albert     |  Camus       | 300 Carroll St 
 40 | Albert     |  Dumbledore  | 400 Carroll St 
 50 | Bertoldt   |  Brecht      | 100 Carroll St  
 30 | Bertoldt   |  Brecht      | 500 Carroll St 
 20 | Caroline   |  Aherne      | 200 Carroll St  
结果集是按
first\u name
顺序排序的表记录;当两条记录的值相同时,排序使用
last\u name
打破平局;当
first\u name
last\u name
都相同时,排序使用
street\u address
。这正是我们所期望的。记录保持完整

对列进行独立排序意味着什么?卡罗尔街100号没有阿尔伯特·阿赫恩这样的人。那么SQL将如何构成一个呢

如果您仍然无法理解这一工作方式,请注意,我在表中添加了一个代理主键。ID列唯一标识每个记录。因此,ID=30表示居住在卡罗尔街500号的贝托尔特·布莱希特。假设ORDER按您预期的方式工作:对于居住在卡罗尔街100号的阿尔伯特·阿赫恩来说,ID的价值是什么


根据规范化表单,在一个表中,所有记录都必须与主键相关,这意味着您不能对多个列进行排序,那么为什么我们需要对多个列进行排序呢

正常化与此无关。我们可能希望按复合键的列排序,甚至按非键属性排序。在这种情况下,我们通常需要按多列排序


例如,我洗牌一副牌。现在我请你们拿五张牌,按升序排列,A低。很简单。除了你画了黑桃七和红桃七。哪个先来?黑桃比黑桃高,所以七颗黑桃比七颗黑桃高。但都是在9家俱乐部之前

以下是一些示例输入数据,我希望这将使以下解释更清楚:

id  | first_name | last_name    | street_address         
 10 | Albert     |  Camus       | 300 Carroll St 
 20 | Caroline   |  Aherne      | 200 Carroll St 
 30 | Bertoldt   |  Brecht      | 500 Carroll St  
 40 | Albert     |  Dumbledore  | 400 Carroll St 
 50 | Bertoldt   |  Brecht      | 100 Carroll St  
这里我们有五条记录,它们告诉我们有用的东西,比如阿尔伯特·加缪住在卡罗尔街300号,卡罗琳·埃亨住在卡罗尔街200号。了解SQL查询的重要一点是它检索记录;当我们使用ORDER BY时,它对记录进行排序,而不是对单个列进行排序

因此,当我们按照名、姓、街道地址对这些记录进行排序时,我们得到以下结果:

id  | first_name | last_name    | street_address         
 10 | Albert     |  Camus       | 300 Carroll St 
 40 | Albert     |  Dumbledore  | 400 Carroll St 
 50 | Bertoldt   |  Brecht      | 100 Carroll St  
 30 | Bertoldt   |  Brecht      | 500 Carroll St 
 20 | Caroline   |  Aherne      | 200 Carroll St  
结果集是按
first\u name
顺序排序的表记录;当两条记录的值相同时,排序使用
last\u name
打破平局;当
first\u name
last\u name
都相同时,排序使用
street\u address
。这正是我们所期望的。记录保持完整

对列进行独立排序意味着什么?卡罗尔街100号没有阿尔伯特·阿赫恩这样的人。那么SQL将如何构成一个呢

如果您仍然无法理解这一工作方式,请注意,我在表中添加了一个代理主键。ID列唯一标识每个记录。因此,ID=30表示居住在卡罗尔街500号的贝托尔特·布莱希特。假设ORDER按您预期的方式工作:对于居住在卡罗尔街100号的阿尔伯特·阿赫恩来说,ID的价值是什么


根据规范化表单,在一个表中,所有记录都必须与主键相关,这意味着您不能对多个列进行排序,那么为什么我们需要对多个列进行排序呢

正常化与此无关。我们可能希望按复合键的列排序,甚至按非键属性排序。在这种情况下,我们通常需要按多列排序

例如,我洗牌一副牌。现在我请你们拿五张牌,按升序排列,A低。很简单。除了你画了黑桃七和红桃七。Whi