2017-11-24 10 views
1

다음의 관계형 데이터베이스에 대한 MySQL 쿼리는 "모든 파생 테이블에 고유 한 별칭이 있어야합니다"라는 오류를 생성합니다. every derived table must have its own aliasEvery derived table must have its own alias error 기준 하위 쿼리와 결과 테이블에있는 모든 테이블에 별칭을 지정합니다. 그러나 그것은 그것을 고치는 것처럼 보이지 않았습니다. 누군가 여기서 아직 실종 된 것을 설명 할 수 있습니까?모든 파생 테이블에는 고유 한 별칭이 있어야하지만 모든 하위 쿼리에 지정된 별칭에는 오류가 발생합니다

SELECT major 
FROM 
    (SELECT major, count(*) amount 
    FROM 
      (((SELECT major 
      FROM 
        (SELECT tutorID 
        FROM questionAnsweredBy 
        AS t1) 
        NATURAL JOIN 
        (SELECT tutorID, major 
        FROM tutor 
        AS t2) AS t12 
      ) 
      AS t3 
      UNION 
      (SELECT major 
      FROM 
        (SELECT tutorID 
        FROM expertAnswerGivenBy 
        AS t4) 
        NATURAL JOIN 
        (SELECT tutorID, major 
        FROM tutor 
        AS t5) AS t13 
      ) 
      AS t6) AS t15 
      UNION 
      (SELECT major 
      FROM 
        (SELECT tutorID 
        FROM textbookSolutionGivenBy 
        AS t7) 
        NATURAL JOIN 
        (SELECT tutorID, major 
        FROM tutor 
        AS t8) AS t14 
      ) 
      AS t9) AS t16 
    GROUP BY major 
    AS t10 
    ) 
AS t11 
+2

각 'NATURAL JOIN (자연 조인)'직전에 하위 쿼리에 별칭이 적용되지 않습니다. –

+0

t1, t4 및 t7이 이러한 쿼리의 별칭이라고 생각하십니까? –

+1

아니요, 그것들은 하위 쿼리 내의'questionAnsweredBy','expertAnswerGivenBy' 및'textbookSolutionGivenBy' 테이블 *의 별명입니다. 하위 쿼리 별칭이 아닙니다 (하위 쿼리 별칭은 하위 쿼리를 묶는 닫는 괄호 뒤에 나타납니다.) –

답변

0

NATURAL JOIN 오른쪽 인수 부속 조회에는 별명이 없습니다. UNION에 대한 인수 인 하위 쿼리에는 별칭이 없어야합니다.

FROM 인수는 table 또는 table [AS] alias 또는 (select ...) [AS] alias입니다. 매우 일반적으로 열의 경우 을 SELECT 절에 사용하지만 테이블/하위 쿼리의 경우 FROM 절에는 사용하지 않는 것이 일반적입니다. (모든 DBMS가 후자를 지원하는 것은 아닙니다.) JOIN과 같이 UNION을 괄호없이 연결할 수 있습니다.

하위 쿼리의 괄호를 세로로 정렬합시다. SELECT, FROM, JOIN, UNION & GROUP BY의 인자를 들여 쓰기로 정렬 해 봅시다.

기술적 인 것을 알고 싶다면 start with the official documentation.

SELECT major 
FROM 
    (SELECT major, count(*) AS amount 
    FROM 
     (
      (SELECT major 
      FROM 
       (SELECT tutorID 
       FROM questionAnsweredBy t1 
       ) nj1 
      NATURAL JOIN 
       (SELECT tutorID, major 
       FROM tutor t2 
       ) t12 
      ) 
     UNION 
      (SELECT major 
      FROM 
       (SELECT tutorID 
       FROM expertAnswerGivenBy t4 
       ) nj2 
      NATURAL JOIN 
       (SELECT tutorID, major 
       FROM tutor t5 
       ) AS t13 
      ) 
     UNION 
      (SELECT major 
      FROM 
       (SELECT tutorID 
       FROM textbookSolutionGivenBy t7 
       ) nj3 
      NATURAL JOIN 
       (SELECT tutorID, major 
       FROM tutor t8 
       ) t14 
      ) 
     ) t16 
    GROUP BY major 
    ) t10 

PS는 더 단순화 재 - 후자 이후 count(*) & 바깥 쪽 select 단지 이전을 실행 취소

group by이 당신에게 아무 소용이 없습니다. 어쨌든 majorunion 결과에서 유일하기 때문에 모든 count(*)은 1입니다.

from 기본 테이블 이름 인 인수는 select 일 필요가 없습니다. 별칭이 필요하지 않습니다. 특히 당신이 그것을 점 치지 않는다면. 또한 하위 선 별칭 from을 조상 인 from의 별칭과 다르게 지정할 필요가 없습니다. 사용되지 않는 별칭을 제안하는 표준 이름/접두어 (예 : x 또는 dummy)를 사용하는 것이 일반적입니다.

관계형 대수를 SQL로 매핑하는 것처럼 보입니다. 아마도 기본 테이블에 행이 중복되거나 열이 중복되거나 null 일 것입니다. select에서 투영을 나타내지 않는 한 select * fromjoin s 일 수도 있습니다. 이상적으로 union corresponding을 사용하십시오. 그러나 지원되지 않는 경우 명시 적으로 열 이름을 나열하여 올바르게 쌍을 이루게하십시오. 항상 또는 열이 다른 순서로있을 수 있습니다. select distinct을 통해 중복을 제거해야합니다. 항상 또는 중복이 발생할 수있는 위치 - select 슈퍼 키가 아닌 곳에 있습니다.

SELECT major 
FROM 
    (SELECT major, count(*) AS amount 
    FROM 
     (
      (SELECT major 
      FROM questionAnsweredBy 
      NATURAL JOIN tutor 
      ) 
     UNION 
      (SELECT major 
      FROM expertAnswerGivenBy 
      NATURAL JOIN tutor 
      ) 
     UNION 
      (SELECT major 
      FROM textbookSolutionGivenBy 
      NATURAL JOIN tutor 
      ) 
     ) x 
    GROUP BY major 
    ) x 
+0

감사! 지금 일하고있어! –

+0

방금 ​​추가로 PS를 추가했습니다. – philipxy