Apa tujuan dari Order By 1 di pernyataan pilih SQL?

154

Saya membaca beberapa kode lama di tempat kerja, dan telah memperhatikan bahwa ada beberapa tampilan dengan order by 1klausa. Apa yang dicapai ini?

Contoh:

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;
gema
sumber
5
FYI: Secara umum dianggap praktik buruk untuk memiliki ORDER OLEH dalam tampilan, kecuali Anda dapat menjamin tampilan hanya akan digunakan untuk presentasi. Itu sia-sia karena ORDER BY akan muncul 2x jika Anda menggunakan tampilan dalam permintaan lain dengan ORDER BY.
OMG Ponies
3
@OMG Ponies: itu umumnya dianggap ilegal untuk memiliki ORDER BYdalam VIEW. SQL standar tidak mengizinkannya. SQL Server telah melarangnya sejak 2005. Untuk implementasi SQL yang mengizinkannya, perilaku ini sebagian besar tidak berdokumen dan kontra intuitif. Dengan kata lain, pasti harus dihindari.
onedaywhen
@onedaywhen: Anda mengabar ke paduan suara, tetapi MySQL mengizinkan ORDER BY dalam pandangan , seperti halnya Oracle IME. SQL Server memungkinkan ORDER BY jika TOPada, dan SSMS suka menambahkan TOP 100 PERCENT.
OMG Ponies
@OMG Ponies @ "MySQL mengizinkan ORDER BY dalam pandangan" - MySQL mengizinkan CHECKkendala dalam CREATE TABLEtetapi itu tidak benar-benar menghormatinya - itu tidak pernah benar-benar diperiksa! Pertanyaannya adalah, apakah produk SQL ini selalu menghormati yang ORDER BYdalam pandangan misalnya bila digunakan dalam query yang juga merupakan ORDER BYapakah itu mendapatkan diurutkan dua kali? Apakah mereka bahkan mendokumentasikan perilaku atau Anda harus melihat rencana eksekusi untuk menyelesaikannya? Saya pikir kita tahu jawabannya;)
onedaywhen
FYI Baru saja menemukan penggunaan lain untuk ORDER BY 1... menggunakan trik lintas-aplikasi di mana Anda ingin alias kosong. Sayangnya kode mis terlalu besar untuk komentar jadi saya sudah mempostingnya sebagai jawaban di bawah FYI.
AndrewD

Jawaban:

208

Ini:

ORDER BY 1

... dikenal sebagai "Ordinal" - angka tersebut adalah singkatan dari kolom berdasarkan jumlah kolom yang ditentukan dalam klausa SELECT. Dalam kueri yang Anda berikan, itu berarti:

ORDER BY A.PAYMENT_DATE

Ini bukan praktik yang disarankan, karena:

  1. Tidak jelas / eksplisit
  2. Jika urutan kolom berubah, kueri masih valid sehingga Anda berisiko memesan oleh sesuatu yang tidak Anda inginkan
OMG Ponies
sumber
1
Pertanyaan saya menanyakan apakah ada keuntungan menggunakan Ordinals: stackoverflow.com/questions/2253040/…
OMG Ponies
Ini hanya memiliki sqltag. Dalam SQL Standar, hanya nama korelasi kolom yang diperbolehkan dalam OREDER BYklausa karena, secara teori, nama korelasi tabel berada di luar cakupan yaitu seharusnya ORDER BY PAYMENT_DATE;. Tentu saja, tidak semua implementasi SQL sesuai dengan Standar.
onedaywhen
Diuji dan bekerja di 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, Anda menyebutkan bahwa ini bukan praktik yang disarankan, jadi apa yang akan menjadi pengganti terbaik berikutnya? bertanya karena aku penasaran .. terima kasih!
dian jin
40

Ini berguna ketika Anda menggunakan operator berbasis mis. Serikat pekerja

select cola
  from tablea
union
select colb
  from tableb
order by 1;
daven11
sumber
4
Aha, itu masuk akal. Ini adalah alasan bagus pertama yang saya lihat sejauh ini.
Gema
4
@ Lazer Saya tidak percaya begitu, untuk melakukan penyatuan mungkin melakukan semacam internal, tapi ini adalah pertanyaan implementasi yang bertentangan dengan pertanyaan keluaran logis dan dalam semangat SQL tidak perlu untuk output baris dalam urutan. Juga bagaimana jika Anda ingin menyortir turun? Kemudian Anda kembali ke masalah semula.
daven11
3
masih ... Saya lebih suka menggunakanorder by tablea.cola
Shahar Shokrani
1
@ ShaharShokrani itu tidak akan berfungsi. tetapi Anda bisa mengatakan, saya lebih suka pilih cola sebagai x dari tablea union pilih colb sebagai x dari pesanan tableb oleh x;
Ozgur Ozturk
pilih * dari (pilih cola col dari tablea union pilih colb col dari tableb) dipesan oleh col
hareluya86
8

itu hanya berarti menyortir tampilan atau tabel dengan kolom 1 hasil kueri.

kshitij
sumber
7

Saya percaya pada Oracle artinya urutan dengan kolom # 1

Christoph
sumber
7

Ini akan mengurutkan hasil Anda dengan kolom pertama yang dikembalikan. Dalam contoh itu akan mengurutkan berdasarkan payment_date.

CTKeane
sumber
4

Seperti yang disebutkan dalam jawaban lain ORDER BY 1perintah oleh kolom pertama.

Saya menemukan contoh lain di mana Anda mungkin menggunakannya. Kami memiliki pertanyaan tertentu yang perlu dipesan pilih kolom yang sama. Anda akan mendapatkan kesalahan SQL jika memesan Namedi bawah ini.

SELECT Name, Name FROM Segment ORDER BY 1
nicV
sumber
Kenapa kamu ingin melakukan itu? kenapa tidak alias mereka. [komentar terlambat]
abdul qayyum
1
@abdulqayyum itu hanyalah cara lain untuk melakukan banyak hal. Contoh di atas sangat sederhana. Terkadang kolom 'Nama' sebenarnya adalah kolom yang berbeda dari tabel berbeda yang Anda sisipkan ke tabel lain. Menambahkan banyak alias dapat membuat membaca menjadi lebih sulit. Contoh lain dari mana digunakan adalah ketika memilih banyak perhitungan yang berbeda & ingin memesan satu - tanpa perlu alias. (Meskipun di sini saya pribadi akan lebih suka alias untuk mengatakan apa perhitungannya)
nicV
-1

Lihat juga:

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

Untuk deskripsi pesanan oleh. Saya belajar sesuatu! :)

Saya juga pernah menggunakan ini di masa lalu ketika saya ingin menambahkan sejumlah filter tak tentu ke pernyataan sql. Ceroboh saya tahu, tetapi berhasil. : P

kdmurray
sumber
-1

Contoh di sini dari sampel sampel database server 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)

Dan ketika itu diberikan tambahan order by PRIVILEGE_TYPEatau bisa diberikan order by 3. Perhatikan kolom ke-3 ( PRIVILEGE_TYPE) diurutkan secara alfabet.

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)

PASTI, jawaban panjang dan banyak bergulir. Saya juga kesulitan untuk meneruskan output dari query ke file teks. Berikut adalah cara melakukannya tanpa menggunakan into outfilehal yang mengganggu-

tee E: /sqllogfile.txt;

Dan ketika Anda selesai, hentikan logging-

membuat marah;

Semoga ini menambah kejelasan.

Kriss
sumber