Lỗi là gì Mỗi bảng dẫn xuất phải có bí danh riêng của mình trong MySQL?


386

Tôi đang chạy truy vấn này trên MySQL

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

và nó đang đưa ra lỗi này:

Mỗi bảng dẫn xuất phải có bí danh riêng.

Điều gì gây ra lỗi này?


14
Bạn không thể đơn giản hóa điều này là "chọn ID từ TT2"?
DMKing

5
Tôi đã gặp lỗi này gần đây vì tôi có thêm )một truy vấn có nhiều UNION ALLs.
mở

10
Xem như thế nào đây là tìm kiếm Google số 1 ... Câu trả lời được chấp nhận không thực sự trả lời lỗi 'Mỗi bảng dẫn xuất phải có bí danh riêng'. Nhìn bên dưới để biết thêm.
Daniel B. Chapman

Câu trả lời:


542

Mỗi bảng dẫn xuất (truy vấn phụ AKA) thực sự phải có bí danh. Tức là mỗi truy vấn trong ngoặc phải được cung cấp một bí danh ( AS whatever), có thể được sử dụng để tham chiếu đến nó trong phần còn lại của truy vấn bên ngoài.

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

Trong trường hợp của bạn, tất nhiên, toàn bộ truy vấn có thể được thay thế bằng:

SELECT ID FROM TT2

21
Câu trả lời đúng cho mã sampe được hiển thị nhưng không phải là giải pháp cho hầu hết người dùng đang tìm kiếm câu hỏi này.
ToBe

1
@ToBe Tôi tò mò ý của bạn là gì? Câu trả lời đúng trong bất kỳ truy vấn nào, rằng nếu bạn có một bảng dẫn xuất trong mệnh đề from của bạn, bạn cần đặt cho nó một bí danh.
AdamMc331

2
Xin lỗi, tôi không thấy bạn cũng sửa lỗi truy vấn ban đầu và thêm các AScâu lệnh. Tôi nghĩ bạn chỉ cho thấy tốc ký. loại bỏ downvote của tôi.
ToBe

Tôi đang suy nghĩ tương tự với @ToBe. Câu trả lời là: "Ở đây, bảng dẫn xuất có nghĩa là 'truy vấn phụ được sử dụng trong mệnh đề TỪ'. Trong trường hợp của người hỏi, chúng là các truy vấn phụ bên trong dấu ngoặc đơn. Nếu bạn không chỉ ra bí danh bằng cách sử dụng từ khóa 'as' đối với các truy vấn đó, công cụ truy vấn dbms không thể xác định truy vấn nào là không có tên (hoặc bí danh) của chúng, vì vậy, bạn phải đặt tên duy nhất (bí danh) cho tất cả các truy vấn phụ của mình để làm cho công cụ truy vấn dbms hoạt động chính xác. "
Bahadir Tasdemir

1
Sẽ tốt hơn để làm rõ truy vấn con không nhất thiết phải là bảng dẫn xuất: nó phải được đặt trực tiếp trong mệnh đề TỪ. Các tuyên bố như SELECT...FROM...WHERE x NOT IN (subquery) AS Tsẽ gây ra lỗi
Nicholas

76

Tôi nghĩ rằng nó yêu cầu bạn làm điều này:

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

Nhưng tại sao bạn lại viết truy vấn này ngay từ đầu?


16
truy vấn thực tế quá dài .. tôi đã rút ngắn nó đủ để mọi người ở đây có ít thời gian hiểu nó hơn. lỗi trên truy vấn ngắn và dài là như nhau.
silverkid

Giờ thì tôi đã hiểu. Tôi cũng đã nghĩ rằng nó có thể đã được tạo ra bởi một số mã. Nó vẫn nên đơn giản hóa như Paul và DMKing đề xuất.
quê hương

9
Wow, đây thực sự là câu trả lời thứ hai không được chấp nhận? Đối với bất kỳ ai có vấn đề thì đây là câu trả lời, MySQL yêu cầu bạn gắn nhãn "truy vấn phụ" thay vì chỉ để lại như nhiều triển khai khác.
Daniel B. Chapman

17

Đây là một ví dụ khác không thể viết lại mà không có bí danh (không thể GROUP BY DISTINCT).

Hãy tưởng tượng một bảng được gọi là purchasesghi lại các giao dịch mua được thực hiện customerstại stores, tức là nhiều bảng và nhiều phần mềm cần biết khách hàng nào đã mua hàng tại nhiều hơn một cửa hàng:

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

.. sẽ phá vỡ với lỗi Every derived table must have its own alias. Sửa chữa:

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);

(Lưu ý AS custombí danh).


Ảnh hưởng của SUM (1) đến truy vấn con là gì?
xssChauhan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.