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.