MySQL에서 "파생 테이블마다 고유 한 별칭이 있어야합니다"라는 오류는 무엇입니까?


386

이 쿼리를 MySQL에서 실행하고 있습니다.

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

이 오류가 발생합니다.

모든 파생 테이블에는 고유 한 별칭이 있어야합니다.

이 오류의 원인은 무엇입니까?


14
이것을 "TT2에서 ID 선택"으로 단순화 할 수 없습니까?
— DMKing 2009

5
s )가 많은 쿼리에 추가 기능이 있기 때문에 최근 에이 오류가 발생했습니다 UNION ALL.
— mpen

10
이것이 구글 검색 # 1의 방법으로 보아 ... 받아 들여진 대답은 실제로 모든 파생 테이블에 자체 별칭이 있어야한다는 오류에 대답하지 않습니다. 자세한 내용은 아래를 참조하십시오.
— 다니엘 B. 채프먼

답변:


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 그게 무슨 뜻인지 궁금 하신가요? from 절에 파생 테이블이있는 경우 별칭을 지정해야한다는 모든 쿼리에서 대답은 사실입니다.
— AdamMc331

2
죄송합니다. 원래 쿼리도 수정하고 AS문을 추가 한 것을 보지 못했습니다 . 나는 당신이 속기만을 보여줄 것이라고 생각했습니다. 내 downvote를 제거했습니다.
— ToBe

@ToBe와 동일하게 생각하고 있습니다. "여기서 파생 된 테이블은 'FROM 절에 사용 된 하위 쿼리'를 의미합니다. 질문자의 경우 괄호 안의 하위 쿼리입니다. 키워드 'as'를 사용하여 별칭을 지정하지 않으면 이러한 쿼리에 대해 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

별명없이 다시 작성할 수없는 다른 예는 다음과 같습니다 (ca n't GROUP BY DISTINCT).

at에서 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);

.. 오류와 함께 중단됩니다 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.