Apa kesalahan "Setiap tabel turunan harus memiliki alias sendiri" di MySQL?


386

Saya menjalankan kueri ini di MySQL

SELECT ID FROM (
    SELECT ID, msisdn
    FROM (
        SELECT * FROM TT2
    )
);

dan itu memberikan kesalahan ini:

Setiap tabel turunan harus memiliki alias sendiri.

Apa yang menyebabkan kesalahan ini?


14
Tidak bisakah Anda menyederhanakan ini sebagai "pilih ID dari TT2"?
DMKing

5
Saya mendapat kesalahan ini baru-baru ini karena saya memiliki tambahan )dalam kueri dengan banyak UNION ALLs.
mpen

10
Melihat bagaimana ini adalah pencarian Google # 1 ... Jawaban yang diterima tidak benar-benar menjawab kesalahan 'Setiap tabel turunan harus memiliki alias sendiri'. Lihat di bawah untuk info lebih lanjut.
Daniel B. Chapman

Jawaban:


542

Setiap tabel turunan (sub-kueri AKA) memang harus memiliki alias. Yaitu setiap permintaan dalam tanda kurung harus diberi alias ( AS whatever), yang dapat digunakan untuk merujuknya di sisa permintaan luar.

SELECT ID FROM (
    SELECT ID, msisdn FROM (
        SELECT * FROM TT2
    ) AS T
) AS T

Dalam kasus Anda, tentu saja, seluruh permintaan dapat diganti dengan:

SELECT ID FROM TT2

21
Jawaban yang benar untuk kode sampe yang ditampilkan tetapi bukan solusi untuk sebagian besar pengguna yang mencari pertanyaan ini.
ToBe

1
@ ToBe saya ingin tahu apa yang Anda maksud dengan itu? Jawabannya berlaku dalam kueri apa pun, bahwa jika Anda memiliki tabel turunan dari klausa Anda, Anda harus memberikannya alias.
AdamMc331

2
Maaf, saya tidak melihat Anda juga memperbaiki kueri asli dan menambahkan ASpernyataan. Saya pikir Anda hanya menunjukkan tulisan singkat. menghapus downvote saya.
ToBe

Saya berpikir sama dengan @ToBe. Jawabannya adalah ini: "Di sini, tabel turunan berarti 'sub-kueri yang digunakan dalam klausa FROM'. Dalam kasus kuesioner, mereka adalah sub-kueri di dalam tanda kurung. Jika Anda tidak menunjukkan alias dengan menggunakan kata kunci 'sebagai' untuk kueri itu, mesin kueri dbms tidak dapat menentukan kueri mana tanpa nama mereka (atau alias) jadi, Anda harus memberikan nama unik (alias) untuk semua sub-kueri Anda untuk membuat mesin kueri dbms membuatnya berfungsi dengan baik. "
Bahadir Tasdemir

1
Akan lebih baik untuk mengklarifikasi subquery yang tidak harus berupa tabel turunan: harus langsung dalam klausa FROM. Pernyataan suka SELECT...FROM...WHERE x NOT IN (subquery) AS Takan memicu kesalahan
Nicholas

76

Saya pikir itu meminta Anda untuk melakukan ini:

SELECT ID
FROM (SELECT ID,
             msisdn 
      FROM (SELECT * FROM TT2) as myalias
     ) as anotheralias;

Tetapi mengapa Anda menulis kueri ini sejak awal?


16
permintaan yang sebenarnya terlalu panjang .. saya telah mempersingkatnya sehingga orang-orang di sini memiliki lebih sedikit waktu untuk memahaminya. kesalahan pada kueri pendek dan panjang sama.
silverkid

Saya mengerti sekarang. Saya juga berpikir itu mungkin dihasilkan oleh beberapa kode. Itu masih harus disederhanakan seperti yang disarankan oleh Paul dan DMKing.
hometoast

9
Wow, apakah ini benar-benar jawaban kedua yang tidak diterima? Bagi siapa pun yang memiliki masalah, inilah jawabannya, MySQL meminta Anda memberi label "sub-kueri" alih-alih membiarkannya seperti banyak implementasi lainnya.
Daniel B. Chapman

17

Berikut adalah contoh berbeda yang tidak dapat ditulis ulang tanpa alias (tidak bisa GROUP BY DISTINCT).

Bayangkan sebuah tabel bernama purchasesyang mencatat pembelian yang dilakukan oleh customersdi stores, yaitu tabel banyak ke banyak dan perangkat lunak perlu mengetahui pelanggan mana yang telah melakukan pembelian di lebih dari satu toko:

SELECT DISTINCT customer_id, SUM(1)
  FROM ( SELECT DISTINCT customer_id, store_id FROM purchases)
  GROUP BY customer_id HAVING 1 < SUM(1);

..akan putus dengan kesalahan Every derived table must have its own alias. Memperbaiki:

SELECT DISTINCT customer_id, SUM(1)
  FROM ( SELECT DISTINCT customer_id, store_id FROM purchases) AS custom
  GROUP BY customer_id HAVING 1 < SUM(1);

(Catat AS customalias).


Apa efek SUM (1) pada subquery?
xssChauhan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.