MySQL'de “Türetilmiş her tablonun kendi takma adı olmalıdır” hatası nedir?


386

Bu sorguyu MySQL üzerinde çalıştırıyorum

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

ve bu hatayı veriyor:

Türetilmiş her tablonun kendi takma adı olmalıdır.

Bu hataya ne sebep oluyor?


14
Bunu "TT2'den kimlik seçin" olarak basitleştiremez misiniz?
DMKing

5
Geçenlerde )bir sürü UNION ALLs ile bir sorguda fazladan bu hatayı aldım .
mpen

10
Bunun # 1 Google araması olduğunu görünce ... Kabul edilen yanıt, 'Türetilmiş her tablonun kendi takma adı olması gerekir' hatasını gerçekten yanıtlamaz. Daha fazla bilgi için aşağıya bakın.
Daniel B. Chapman

Yanıtlar:


542

Türetilmiş her tablonun (AKA alt sorgusu) gerçekten bir takma adı olmalıdır. Köşeli parantez içindeki her sorguya AS whatever, dış sorgunun geri kalanında başvurmak için kullanılabilecek bir diğer ad ( ) verilmelidir .

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

Sizin durumunuzda, elbette, tüm sorgu şu şekilde değiştirilebilir:

SELECT ID FROM TT2

21
Gösterilen sampe kodu için doğru cevap, ancak bu soruyu arayan çoğu kullanıcı için çözüm değil.
2014'te

1
Ne demek istediğini merak ediyorum? Yanıt herhangi bir sorguda doğrudur, eğer yan tümcenizde türetilmiş bir tablonuz varsa ona bir takma ad vermeniz gerekir.
AdamMc331

2
Üzgünüz, orijinal sorguyu da düzelttiğinizi ve ASifadeleri eklediğinizi görmedim . Sadece stenoyu gösterdiğini sanıyordum. benim oyumu kaldırdı.
15'te ToBe

@ToBe ile aynı şeyi düşünüyorum. Cevap şudur: "Burada türetilmiş tablo, 'FROM yan tümcesinde kullanılan alt sorgu' anlamına gelir. Sorgulayanların durumunda, bunlar parantez içindeki alt sorgulardır. 'Diğer' anahtar kelimesini kullanarak takma adı belirtmezseniz bu sorgular için, dbms sorgu motoru, hangi sorgunun adları (veya takma adları) olmadan ne olduğunu belirleyemez, bu nedenle, dbms sorgu altyapısının düzgün çalışmasını sağlamak için tüm alt sorgularınız için benzersiz adlar (takma adlar) vermeniz gerekir. "
Bahadir Tasdemir

1
Alt sorgunun mutlaka türetilmiş bir tablo olmadığını açıklığa kavuşturmak daha iyidir: doğrudan bir FROM yan tümcesi içinde olmalıdır. Gibi ifadeler SELECT...FROM...WHERE x NOT IN (subquery) AS Tbir hatayı tetikler
Nicholas

76

Sanırım bunu yapmanızı istiyor:

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

Ama neden bu sorguyu ilk başta yazasın?


16
gerçek sorgu çok uzun .. ben burada insanların bunu anlamak daha az zaman var yeterince kısalttık. kısa ve uzun sorgudaki hata aynıydı.
silverkid

Şimdi anlıyorum. Ayrıca bazı kod tarafından oluşturulmuş olabileceğini düşünüyordum. Paul ve DMKing'in önerdiği gibi hala basitleştirilmelidir.
09:36

9
Wow, bu gerçekten kabul edilmeyen ikinci cevap mı? Sorunu olan herkes için bu cevaptır, MySQL, diğer birçok uygulama gibi bırakmak yerine "alt sorguyu" etiketlemenizi gerektirir.
Daniel B. Chapman

17

Takma ad olmadan yeniden yazılamayan farklı bir örnek (yapamıyorum GROUP BY DISTINCT ).

Denilen bir tablo düşünün purchasestarafından yapılan kayıtlar alımları olduğunu customersaz stores, birçok masa ve birden fazla mağazada alışveriş yapan hangi müşterilerin bilmek yazılım ihtiyaçlarına birçok var yani:

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

... hatayla kırılacak Every derived table must have its own alias. Düzeltmek:

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 customTakma adı not edin ).


TOPLA (1) 'nin alt sorgu üzerindeki etkisi nedir?
xssChauhan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.