ข้อผิดพลาด“ ทุกตารางที่ได้รับจะต้องมีนามแฝงของตัวเอง” ใน MySQL คืออะไร


386

ฉันใช้แบบสอบถามนี้ใน MySQL

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

และมันทำให้เกิดข้อผิดพลาดนี้:

ทุกตารางที่ได้รับจะต้องมีนามแฝงของตัวเอง

อะไรเป็นสาเหตุของข้อผิดพลาดนี้?


14
คุณไม่สามารถทำให้สิ่งนี้ง่ายขึ้นในฐานะ "เลือก ID จาก TT2"
DMKing

5
ผมได้รับข้อผิดพลาดนี้เมื่อเร็ว ๆ นี้เพราะผมมีความพิเศษ)ในแบบสอบถามที่มีจำนวนมากของUNION ALLs
mpen

10
การดูว่านี่คือการค้นหาของ Google # 1 ... คำตอบที่ยอมรับไม่ได้ตอบข้อผิดพลาดจริง ๆ 'ตารางที่ได้รับทุกรายการจะต้องมีนามแฝงของตัวเอง' ดูด้านล่างสำหรับข้อมูลเพิ่มเติม
Daniel B. Chapman

คำตอบ:


542

ทุกตารางที่ได้รับ (แบบสอบถามย่อย AKA) ต้องมีนามแฝง คือแต่ละแบบสอบถามในวงเล็บจะต้องได้รับนามแฝง ( AS whatever) ซึ่งสามารถนำมาใช้เพื่ออ้างถึงมันในส่วนที่เหลือของแบบสอบถามด้านนอก

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

ในกรณีของคุณแน่นอนสามารถแทนที่แบบสอบถามทั้งหมดด้วย:

SELECT ID FROM TT2

21
คำตอบที่ถูกต้องสำหรับรหัส sampe ที่แสดง แต่ไม่ใช่วิธีแก้ปัญหาสำหรับผู้ใช้ส่วนใหญ่ที่ค้นหาคำถามนี้
ToBe

1
@ToBe ฉันอยากรู้ว่าคุณหมายถึงอะไร? คำตอบยังคงเป็นจริงในแบบสอบถามใด ๆ หากคุณมีตารางที่ได้รับมาจากประโยคของคุณคุณจะต้องให้มันนามแฝง
AdamMc331

2
ขออภัยฉันไม่เห็นว่าคุณได้แก้ไขคิวรีดั้งเดิมและเพิ่มASข้อความดังกล่าว ฉันคิดว่าคุณแสดงชวเลขเท่านั้น ลบ downvote ของฉัน
Tobe

ฉันคิดแบบเดียวกันกับ @ToBe คำตอบคือ: "ที่นี่ตารางที่ได้รับหมายถึง 'แบบสอบถามย่อยที่ใช้ในส่วนคำสั่ง FROM' ในกรณีของผู้ถามคำถามเหล่านี้คือแบบสอบถามย่อยภายในวงเล็บถ้าคุณไม่ระบุนามแฝงโดยใช้คำสำคัญ 'เป็น' สำหรับเคียวรีเหล่านั้นเอ็นจิ้น dbms เคียวรีไม่สามารถระบุเคียวรีใดที่ไม่มีชื่อ (หรือนามแฝง) ดังนั้นคุณต้องให้ชื่อที่ไม่ซ้ำ (นามแฝง) สำหรับเคียวรีย่อยทั้งหมดของคุณเพื่อให้เคียวรีย่อย dbms ทำงานอย่างถูกต้อง "
Bahadir Tasdemir

1
มันจะดีกว่าที่จะชี้แจงแบบสอบถามย่อยไม่จำเป็นต้องเป็นตารางที่ได้รับ: มันจะต้องอยู่ภายในข้อ FROM โดยตรง ข้อความเช่นSELECT...FROM...WHERE x NOT IN (subquery) AS Tจะทำให้เกิดข้อผิดพลาด
Nicholas

76

ฉันคิดว่ามันขอให้คุณทำเช่นนี้:

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

แต่ทำไมคุณถึงเขียนแบบสอบถามนี้ตั้งแต่แรก?


16
ข้อความค้นหาจริงยาวเกินไป .. ฉันย่อให้สั้นลงพอที่คนที่นี่มีเวลาน้อยกว่าที่จะเข้าใจ ข้อผิดพลาดในแบบสอบถามสั้นและยาวเหมือนกัน
silverkid

ฉันเข้าใจแล้ว. ฉันก็คิดว่ามันอาจจะถูกสร้างขึ้นโดยรหัสบางอย่าง ควรลดความซับซ้อนลงตามที่ Paul และ DMKing แนะนำ
hometoast

9
ว้าวนี่เป็นคำตอบที่สองที่ไม่ได้รับการยอมรับจริงๆหรือ สำหรับทุกคนที่มีปัญหานี่คือคำตอบ, MySQL ต้องการให้คุณติดป้าย "แบบสอบถามย่อย" แทนที่จะปล่อยให้มันเหมือนกับการใช้งานอื่น ๆ
Daniel B. Chapman

17

นี่คือตัวอย่างอื่นที่ไม่สามารถเขียนGROUP BY DISTINCTซ้ำได้หากไม่มีนามแฝง (ไม่สามารถทำได้)

ลองนึกภาพตารางที่เรียกpurchasesว่าบันทึกการซื้อที่เกิดขึ้นจากcustomersที่storesนั่นคือหลายต่อหลายตารางและซอฟต์แวร์จำเป็นต้องรู้ว่าลูกค้ารายใดทำการซื้อที่ร้านมากกว่าหนึ่งแห่ง

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

..will Every derived table must have its own aliasเลิกกับข้อผิดพลาด เพื่อแก้ไข:

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

(หมายเหตุAS customนามแฝง)


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