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