วัตถุประสงค์ของการสั่งซื้อโดย 1 ในคำสั่ง SQL เลือกคืออะไร?


154

ฉันอ่านรหัสเก่า ๆ ในที่ทำงานและสังเกตว่ามีหลายมุมมองพร้อมorder by 1ประโยค สิ่งนี้ทำให้สำเร็จ

ตัวอย่าง:

Create view v_payment_summary AS
SELECT A.PAYMENT_DATE,
       (SELECT SUM(paymentamount)
          FROM payment B
         WHERE PAYMENT_DATE = B.PAYMENT_DATE
           and SOME CONDITION) AS SUM_X,
       (SELECT SUM(paymentamount)
          FROM payment B
         WHERE PAYMENT_DATE = B.PAYMENT_DATE
           and SOME OTHER CONDITION) AS SUM_Y    
FROM payment A    
ORDER BY 1;

5
FYI: โดยทั่วไปถือว่าเป็นการปฏิบัติที่ไม่ดีที่จะมีคำสั่งซื้อในมุมมองเว้นแต่ว่าคุณจะสามารถรับประกันได้ว่าจะมีการใช้มุมมองเพื่อนำเสนอเท่านั้น มันเป็นเรื่องเสียเพราะ ORDER BY จะเกิดขึ้น 2 เท่าหากคุณใช้มุมมองในแบบสอบถามอื่นที่มี ORDER BY
OMG Ponies

3
@OMG ม้า: ก็ถือว่าผิดกฎหมายโดยทั่วไปที่จะมีในORDER BY VIEWSQL มาตรฐานไม่อนุญาต SQL Server นั้นผิดกฎหมายมาตั้งแต่ปี 2005 สำหรับการติดตั้ง SQL ที่ทำให้เกิดพฤติกรรมส่วนใหญ่จะไม่มีเอกสารและตัวนับที่ใช้งานง่าย ในคำอื่น ๆ แน่นอนที่จะหลีกเลี่ยง
oneday เมื่อ

@onedaywhen: คุณกำลังเทศนาให้กับคณะนักร้องประสานเสียง แต่ MySQL อนุญาตให้ ORDER BY ในมุมมองเช่นเดียวกับ Oracle IME SQL Server ช่วยให้ ORDER BY ถ้าTOPเป็นปัจจุบันและ SSMS TOP 100 PERCENTรักที่จะเพิ่ม
OMG Ponies

@OMG Ponies @ "MySQL อนุญาตให้เรียงลำดับตามในมุมมอง" - MySQL อนุญาตให้มีCHECKข้อ จำกัด ในการใช้งานCREATE TABLEแต่ไม่ได้ให้เกียรติอย่างแท้จริง - ไม่เคยได้รับการตรวจสอบจริง! คำถามคือทำผลิตภัณฑ์เหล่านี้ SQL เสมอเกียรติORDER BYในมุมมองเช่นเมื่อใช้ในการสอบถามว่ายังยORDER BYมันไม่ได้รับการเรียงสองครั้ง พวกเขายังบันทึกพฤติกรรมหรือไม่หรือคุณต้องดูแผนการดำเนินการเพื่อที่จะทำมันออกมา? ผมคิดว่าเรารู้คำตอบ;)
onedaywhen

FYI เพิ่งค้นพบการใช้งานอื่นสำหรับORDER BY 1... โดยใช้เคล็ดลับ cross-Apply ที่คุณต้องการนามแฝงที่ว่างเปล่า น่าเสียดายที่รหัสเช่นนั้นใหญ่เกินไปสำหรับความคิดเห็นดังนั้นฉันจึงโพสต์ไว้เป็นคำตอบใต้ FYI
AndrewD

คำตอบ:


208

นี้:

ORDER BY 1

... เรียกว่า "Ordinal" - ตัวเลขหมายถึงคอลัมน์ตามจำนวนคอลัมน์ที่กำหนดไว้ในคำสั่งย่อย SELECT ในแบบสอบถามที่คุณให้ไว้หมายถึง:

ORDER BY A.PAYMENT_DATE

ไม่ใช่วิธีปฏิบัติที่แนะนำเนื่องจาก:

  1. ไม่ชัดเจน / ชัดเจน
  2. หากการเรียงลำดับคอลัมน์เปลี่ยนแปลงไปแบบสอบถามจะยังคงใช้งานอยู่ดังนั้นคุณจึงเสี่ยงต่อการเรียงลำดับโดยสิ่งที่คุณไม่ต้องการ

1
คำถามของฉันถามว่ามีอัพไซด์ให้ใช้ Ordinals: stackoverflow.com/questions/2253040/ หรือไม่
OMG Ponies

มีเพียงsqlแท็กเท่านั้น ในมาตรฐาน SQL เฉพาะชื่อคอลัมน์ความสัมพันธ์ที่ได้รับอนุญาตในประโยคเพราะในทางทฤษฎีชื่อตารางความสัมพันธ์จะออกจากขอบเขตที่ควรจะเป็นคือOREDER BY ORDER BY PAYMENT_DATE;แน่นอนว่าการใช้งาน SQL ไม่ได้เป็นไปตามมาตรฐาน
oneday เมื่อ

ผ่านการทดสอบและทำงานใน SQL Server;WITH cte AS( SELECT 1 AS Col1, 'z' AS Col2 UNION SELECT 2 AS Col1, 'y' AS Col2 UNION SELECT 3 AS Col1, 'x' AS Col2 ) SELECT Col2, Col1 FROM cte ORDER BY 1
Ivanzinho

@OMG Ponies คุณพูดถึงว่ามันไม่ใช่วิธีปฏิบัติที่แนะนำดังนั้นอะไรจะเป็นการทดแทนที่ดีที่สุดต่อไป ถาม cuz ฉันอยากรู้อยากเห็น .. ขอบคุณ!
dian jin

40

สิ่งนี้มีประโยชน์เมื่อคุณใช้โอเปอเรเตอร์ที่ตั้งค่าไว้เช่นยูเนี่ยน

select cola
  from tablea
union
select colb
  from tableb
order by 1;

4
อ้านั่นเหมาะสมแล้ว นี่เป็นเหตุผลที่ดีครั้งแรกที่ฉันเคยเห็น
echo

4
@ เลเซอร์ฉันไม่เชื่อเช่นนั้นในการดำเนินการสหภาพมันอาจจะเรียงลำดับภายใน แต่นี่เป็นคำถามการใช้งานซึ่งตรงข้ามกับคำถามเอาท์พุทตรรกะและในจิตวิญญาณของ SQL ไม่จำเป็นต้องออกแถวตามลำดับ นอกจากนี้หากคุณต้องการเรียงลำดับจากมากไปน้อย จากนั้นคุณกลับไปที่ปัญหาเดิม
daven11

3
ยัง ... ฉันอยากจะใช้order by tablea.cola
Shahar Shokrani

1
@ShaharShokrani ที่จะไม่ทำงาน แต่คุณสามารถพูดได้ว่าฉันชอบเลือก cola เป็น x จาก tablea union เลือก colb เป็น x จาก tableb order โดย x;
Ozgur Ozturk

เลือก * จาก (เลือก cola col จาก tablea union เลือก colb col จาก tableb) สั่งซื้อโดย col
hareluya86

8

หมายถึงการเรียงลำดับมุมมองหรือตารางตามคอลัมน์ที่ 1 ของผลลัพธ์ของแบบสอบถาม



7

การดำเนินการนี้จะจัดเรียงผลลัพธ์ของคุณตามคอลัมน์แรกที่ส่งคืน ในตัวอย่างมันจะเรียงลำดับตาม payment_date


4

ตามที่ระบุไว้ในคำตอบอื่น ๆ คำORDER BY 1สั่งซื้อโดยคอลัมน์แรก

ฉันเจอตัวอย่างที่คุณอาจใช้อีก เรามีข้อสงสัยบางข้อที่จำเป็นต้องสั่งซื้อให้เลือกคอลัมน์เดียวกัน คุณจะได้รับข้อผิดพลาด SQL หากสั่งซื้อโดยNameด้านล่าง

SELECT Name, Name FROM Segment ORDER BY 1

ทำไมคุณจะทำเช่นนั้น? ทำไมไม่ใช้นามแฝงพวกเขา [แสดงความคิดเห็นช้าเกินไป]
abdul qayyum

1
@abdulqayyum มันเป็นอีกวิธีหนึ่งในการทำสิ่งต่าง ๆ จริงๆ ตัวอย่างข้างต้นง่ายมาก บางครั้งคอลัมน์ 'ชื่อ' เป็นคอลัมน์ที่แตกต่างจากตารางอื่นที่คุณแทรกเข้าไปในตารางอื่น การเพิ่มนามแฝงจำนวนมากสามารถทำให้การอ่านยากขึ้น อีกตัวอย่างของการใช้เมื่อเลือกการคำนวณที่แตกต่างกัน & ต้องการเรียงลำดับโดยไม่ต้องใช้นามแฝง (แม้ว่านี่ผมเองต้องการนามแฝงที่จะพูดในสิ่งที่คำนวณคือ)
nicV

-1

ดูเพิ่มเติมที่:

http://www.techonthenet.com/sql/order_by.php

สำหรับคำอธิบายของการสั่งซื้อโดย ฉันได้เรียนรู้บางสิ่ง! :)

ฉันเคยใช้สิ่งนี้ในอดีตเมื่อฉันต้องการเพิ่มจำนวนฟิลเตอร์ที่ไม่แน่นอนในคำสั่ง sql เลอะเทอะฉันรู้ แต่มันก็ใช้ได้ : P


-1

ตัวอย่างที่นี่จากตัวอย่างการทดสอบฐานข้อมูลเซิร์ฟเวอร์ WAMP: -

mysql> select * from user_privileges;

| GRANTEE            | TABLE_CATALOG | PRIVILEGE_TYPE          | IS_GRANTABLE |
   +--------------------+---------------+-------------------------+--------------+
| 'root'@'localhost' | def           | SELECT                  | YES          |
| 'root'@'localhost' | def           | INSERT                  | YES          |
| 'root'@'localhost' | def           | UPDATE                  | YES          |
| 'root'@'localhost' | def           | DELETE                  | YES          |
| 'root'@'localhost' | def           | CREATE                  | YES          |
| 'root'@'localhost' | def           | DROP                    | YES          |
| 'root'@'localhost' | def           | RELOAD                  | YES          |
| 'root'@'localhost' | def           | SHUTDOWN                | YES          |
| 'root'@'localhost' | def           | PROCESS                 | YES          |
| 'root'@'localhost' | def           | FILE                    | YES          |
| 'root'@'localhost' | def           | REFERENCES              | YES          |
| 'root'@'localhost' | def           | INDEX                   | YES          |
| 'root'@'localhost' | def           | ALTER                   | YES          |
| 'root'@'localhost' | def           | SHOW DATABASES          | YES          |
| 'root'@'localhost' | def           | SUPER                   | YES          |
| 'root'@'localhost' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'localhost' | def           | LOCK TABLES             | YES          |
| 'root'@'localhost' | def           | EXECUTE                 | YES          |
| 'root'@'localhost' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'localhost' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'localhost' | def           | CREATE VIEW             | YES          |
| 'root'@'localhost' | def           | SHOW VIEW               | YES          |
| 'root'@'localhost' | def           | CREATE ROUTINE          | YES          |
| 'root'@'localhost' | def           | ALTER ROUTINE           | YES          |
| 'root'@'localhost' | def           | CREATE USER             | YES          |
| 'root'@'localhost' | def           | EVENT                   | YES          |
| 'root'@'localhost' | def           | TRIGGER                 | YES          |
| 'root'@'localhost' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'127.0.0.1' | def           | SELECT                  | YES          |
| 'root'@'127.0.0.1' | def           | INSERT                  | YES          |
| 'root'@'127.0.0.1' | def           | UPDATE                  | YES          |
| 'root'@'127.0.0.1' | def           | DELETE                  | YES          |
| 'root'@'127.0.0.1' | def           | CREATE                  | YES          |
| 'root'@'127.0.0.1' | def           | DROP                    | YES          |
| 'root'@'127.0.0.1' | def           | RELOAD                  | YES          |
| 'root'@'127.0.0.1' | def           | SHUTDOWN                | YES          |
| 'root'@'127.0.0.1' | def           | PROCESS                 | YES          |
| 'root'@'127.0.0.1' | def           | FILE                    | YES          |
| 'root'@'127.0.0.1' | def           | REFERENCES              | YES          |
| 'root'@'127.0.0.1' | def           | INDEX                   | YES          |
| 'root'@'127.0.0.1' | def           | ALTER                   | YES          |
| 'root'@'127.0.0.1' | def           | SHOW DATABASES          | YES          |
| 'root'@'127.0.0.1' | def           | SUPER                   | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'127.0.0.1' | def           | LOCK TABLES             | YES          |
| 'root'@'127.0.0.1' | def           | EXECUTE                 | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'127.0.0.1' | def           | CREATE VIEW             | YES          |
| 'root'@'127.0.0.1' | def           | SHOW VIEW               | YES          |
| 'root'@'127.0.0.1' | def           | CREATE ROUTINE          | YES          |
| 'root'@'127.0.0.1' | def           | ALTER ROUTINE           | YES          |
| 'root'@'127.0.0.1' | def           | CREATE USER             | YES          |
| 'root'@'127.0.0.1' | def           | EVENT                   | YES          |
| 'root'@'127.0.0.1' | def           | TRIGGER                 | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'::1'       | def           | SELECT                  | YES          |
| 'root'@'::1'       | def           | INSERT                  | YES          |
| 'root'@'::1'       | def           | UPDATE                  | YES          |
| 'root'@'::1'       | def           | DELETE                  | YES          |
| 'root'@'::1'       | def           | CREATE                  | YES          |
| 'root'@'::1'       | def           | DROP                    | YES          |
| 'root'@'::1'       | def           | RELOAD                  | YES          |
| 'root'@'::1'       | def           | SHUTDOWN                | YES          |
| 'root'@'::1'       | def           | PROCESS                 | YES          |
| 'root'@'::1'       | def           | FILE                    | YES          |
| 'root'@'::1'       | def           | REFERENCES              | YES          |
| 'root'@'::1'       | def           | INDEX                   | YES          |
| 'root'@'::1'       | def           | ALTER                   | YES          |
| 'root'@'::1'       | def           | SHOW DATABASES          | YES          |
| 'root'@'::1'       | def           | SUPER                   | YES          |
| 'root'@'::1'       | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'::1'       | def           | LOCK TABLES             | YES          |
| 'root'@'::1'       | def           | EXECUTE                 | YES          |
| 'root'@'::1'       | def           | REPLICATION SLAVE       | YES          |
| 'root'@'::1'       | def           | REPLICATION CLIENT      | YES          |
| 'root'@'::1'       | def           | CREATE VIEW             | YES          |
| 'root'@'::1'       | def           | SHOW VIEW               | YES          |
| 'root'@'::1'       | def           | CREATE ROUTINE          | YES          |
| 'root'@'::1'       | def           | ALTER ROUTINE           | YES          |
| 'root'@'::1'       | def           | CREATE USER             | YES          |
| 'root'@'::1'       | def           | EVENT                   | YES          |
| 'root'@'::1'       | def           | TRIGGER                 | YES          |
| 'root'@'::1'       | def           | CREATE TABLESPACE       | YES          |
| ''@'localhost'     | def           | USAGE                   | NO           |
+--------------------+---------------+-------------------------+--------------+
85 rows in set (0.00 sec)

และเมื่อมันจะได้รับเพิ่มเติมหรือจะได้รับorder by PRIVILEGE_TYPE order by 3สังเกตเห็นคอลัมน์ที่ 3 ( PRIVILEGE_TYPE) เรียงลำดับตามตัวอักษร

mysql> select * from user_privileges order by PRIVILEGE_TYPE;
+--------------------+---------------+-------------------------+--------------+
| GRANTEE            | TABLE_CATALOG | PRIVILEGE_TYPE          | IS_GRANTABLE |
+--------------------+---------------+-------------------------+--------------+
| 'root'@'127.0.0.1' | def           | ALTER                   | YES          |
| 'root'@'::1'       | def           | ALTER                   | YES          |
| 'root'@'localhost' | def           | ALTER                   | YES          |
| 'root'@'::1'       | def           | ALTER ROUTINE           | YES          |
| 'root'@'localhost' | def           | ALTER ROUTINE           | YES          |
| 'root'@'127.0.0.1' | def           | ALTER ROUTINE           | YES          |
| 'root'@'127.0.0.1' | def           | CREATE                  | YES          |
| 'root'@'::1'       | def           | CREATE                  | YES          |
| 'root'@'localhost' | def           | CREATE                  | YES          |
| 'root'@'::1'       | def           | CREATE ROUTINE          | YES          |
| 'root'@'localhost' | def           | CREATE ROUTINE          | YES          |
| 'root'@'127.0.0.1' | def           | CREATE ROUTINE          | YES          |
| 'root'@'::1'       | def           | CREATE TABLESPACE       | YES          |
| 'root'@'localhost' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TABLESPACE       | YES          |
| 'root'@'::1'       | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'localhost' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'127.0.0.1' | def           | CREATE TEMPORARY TABLES | YES          |
| 'root'@'localhost' | def           | CREATE USER             | YES          |
| 'root'@'127.0.0.1' | def           | CREATE USER             | YES          |
| 'root'@'::1'       | def           | CREATE USER             | YES          |
| 'root'@'localhost' | def           | CREATE VIEW             | YES          |
| 'root'@'127.0.0.1' | def           | CREATE VIEW             | YES          |
| 'root'@'::1'       | def           | CREATE VIEW             | YES          |
| 'root'@'127.0.0.1' | def           | DELETE                  | YES          |
| 'root'@'::1'       | def           | DELETE                  | YES          |
| 'root'@'localhost' | def           | DELETE                  | YES          |
| 'root'@'::1'       | def           | DROP                    | YES          |
| 'root'@'localhost' | def           | DROP                    | YES          |
| 'root'@'127.0.0.1' | def           | DROP                    | YES          |
| 'root'@'127.0.0.1' | def           | EVENT                   | YES          |
| 'root'@'::1'       | def           | EVENT                   | YES          |
| 'root'@'localhost' | def           | EVENT                   | YES          |
| 'root'@'127.0.0.1' | def           | EXECUTE                 | YES          |
| 'root'@'::1'       | def           | EXECUTE                 | YES          |
| 'root'@'localhost' | def           | EXECUTE                 | YES          |
| 'root'@'127.0.0.1' | def           | FILE                    | YES          |
| 'root'@'::1'       | def           | FILE                    | YES          |
| 'root'@'localhost' | def           | FILE                    | YES          |
| 'root'@'localhost' | def           | INDEX                   | YES          |
| 'root'@'127.0.0.1' | def           | INDEX                   | YES          |
| 'root'@'::1'       | def           | INDEX                   | YES          |
| 'root'@'::1'       | def           | INSERT                  | YES          |
| 'root'@'localhost' | def           | INSERT                  | YES          |
| 'root'@'127.0.0.1' | def           | INSERT                  | YES          |
| 'root'@'127.0.0.1' | def           | LOCK TABLES             | YES          |
| 'root'@'::1'       | def           | LOCK TABLES             | YES          |
| 'root'@'localhost' | def           | LOCK TABLES             | YES          |
| 'root'@'127.0.0.1' | def           | PROCESS                 | YES          |
| 'root'@'::1'       | def           | PROCESS                 | YES          |
| 'root'@'localhost' | def           | PROCESS                 | YES          |
| 'root'@'::1'       | def           | REFERENCES              | YES          |
| 'root'@'localhost' | def           | REFERENCES              | YES          |
| 'root'@'127.0.0.1' | def           | REFERENCES              | YES          |
| 'root'@'::1'       | def           | RELOAD                  | YES          |
| 'root'@'localhost' | def           | RELOAD                  | YES          |
| 'root'@'127.0.0.1' | def           | RELOAD                  | YES          |
| 'root'@'::1'       | def           | REPLICATION CLIENT      | YES          |
| 'root'@'localhost' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION CLIENT      | YES          |
| 'root'@'::1'       | def           | REPLICATION SLAVE       | YES          |
| 'root'@'localhost' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'127.0.0.1' | def           | REPLICATION SLAVE       | YES          |
| 'root'@'127.0.0.1' | def           | SELECT                  | YES          |
| 'root'@'::1'       | def           | SELECT                  | YES          |
| 'root'@'localhost' | def           | SELECT                  | YES          |
| 'root'@'127.0.0.1' | def           | SHOW DATABASES          |  YES          |
| 'root'@'::1'       | def           | SHOW DATABASES          | YES          |
| 'root'@'localhost' | def           | SHOW DATABASES          | YES          |
| 'root'@'127.0.0.1' | def           | SHOW VIEW               | YES          |
| 'root'@'::1'       | def           | SHOW VIEW               | YES          |
| 'root'@'localhost' | def           | SHOW VIEW               | YES          |
| 'root'@'localhost' | def           | SHUTDOWN                | YES          |
| 'root'@'127.0.0.1' | def           | SHUTDOWN                | YES          |
| 'root'@'::1'       | def           | SHUTDOWN                | YES          |
| 'root'@'::1'       | def           | SUPER                   | YES          |
| 'root'@'localhost' | def           | SUPER                   | YES          |
| 'root'@'127.0.0.1' | def           | SUPER                   | YES          |
| 'root'@'127.0.0.1' | def           | TRIGGER                 | YES          |
| 'root'@'::1'       | def           | TRIGGER                 | YES          |
| 'root'@'localhost' | def           | TRIGGER                 | YES          |
| 'root'@'::1'       | def           | UPDATE                  | YES          |
| 'root'@'localhost' | def           | UPDATE                  | YES          |
| 'root'@'127.0.0.1' | def           | UPDATE                  | YES          |
| ''@'localhost'     | def           | USAGE                   | NO           |     +--------------------+---------------+-------------------------+--------------+
85 rows in set (0.00 sec)

DEFINITIVELY, คำตอบที่ยาวและมากของการเลื่อน นอกจากนี้ฉันพยายามอย่างหนักเพื่อส่งออกของแบบสอบถามไปยังไฟล์ข้อความ นี่คือวิธีการทำโดยไม่ใช้into outfileสิ่งที่น่ารำคาญ-

ที E: /sqllogfile.txt;

และเมื่อเสร็จแล้วให้หยุดการบันทึก

ทีออฟ

หวังว่ามันจะเพิ่มความชัดเจนมากขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.