1052 : 필드 목록의 'id'열이 모호합니다.


98

2 개의 테이블이 있습니다. tbl_names그리고 tbl_section이는 모두가 id그들에 필드. id항상이 오류가 발생하므로 필드 를 선택하려면 어떻게해야합니까?

1052: Column 'id' in field list is ambiguous

내 질문은 다음과 같습니다.

SELECT id, name, section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id

모든 필드를 선택하고 오류를 피할 수 있습니다. 그러나 그것은 성능의 낭비입니다. 어떻게해야합니까?

답변:


155

SQL은 전체 테이블 이름을 참조 접두사로 지정하여 열 규정을 지원합니다.

SELECT tbl_names.id, tbl_section.id, name, section
  FROM tbl_names
  JOIN tbl_section ON tbl_section.id = tbl_names.id 

... 또는 테이블 별칭 :

SELECT n.id, s.id, n.name, s.section
  FROM tbl_names n
  JOIN tbl_section s ON s.id = n.id 

테이블 별칭은 권장되는 접근 방식입니다. 필요한 것보다 더 많이 입력하는 이유는 무엇입니까?

이러한 쿼리가 다르게 보이는 이유는 무엇입니까?

둘째, 내 대답은 ANSI-92 JOIN 구문을 사용합니다 (당신은 ANSI-89입니다). 동일한 기능을 수행하지만 ANSI-89 구문은 OUTER 조인 (RIGHT, LEFT, FULL)을 지원하지 않습니다. ANSI-89 구문은 더 이상 사용되지 않는 것으로 간주되어야하며,이를 강화하기 위해 ANSI-89 구문에 투표하지 않는 사람들이 많이 있습니다. 자세한 내용은이 질문을 참조하십시오 .


혼란스러워! 실제로 SQL 언어에서 제거 된 것이 없기 때문에 SQL-89는 SQL-92의 적절한 하위 집합입니다. OP의 구문은 유효한 SQL-92 구문입니다 (그리고 누락 된 것이 없으면 유효한 SQL-89 구문입니다). INNER JOINSQL-92가 도입 된 이후로 '감가 상각'된 것으로 간주 됩니다 NATURAL JOIN.
onedaywhen

17

당신의 SELECT진술에서 당신은 당신이 그것을 선택하고 싶은 테이블로 당신의 ID를 시작해야합니다.

SELECT tbl_names.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id

또는

SELECT tbl_section.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id

이것은 id필드 중 하나만 리턴 합니다. OP는 "모든 필드를 선택하고 오류를 피하십시오."라고 말합니다. 그리고 저는 ANSI-89 구문에 투표하지 않습니다.
OMG Ponies 2011

동의했지만 질문은 ID 필드를 선택하는 방법이었습니다.
Taryn

6

정규화 된 이름을 제공하면됩니다. 예 :

SELECT tbl_names.id as id, name, section FROM tbl_names, tbl_section WHERE tbl_names.id = tbl_section.id

tbl_names의 ID를 제공합니다.


bluefeet의 대답에 내 의견을 참조하십시오
OMG 조랑말

'정규화 된 이름'이 아니라 범위 변수입니다. 명시 적 범위 변수를 생략하면 SQL은 테이블 이름과 동일한 변수를 생성합니다. 내가 의미하는 바를 더 잘 보려면 FROM절을 변경하십시오 ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE.... 이것이 범위 변수를 생성하기 위해 파서가 수행하는 작업입니다.
onedaywhen

4

가장 간단한 해결책은 함께 조인 USING대신 ON. 이렇게하면 데이터베이스는 두 id열이 실제로 동일 하다는 것을 "인식"하고 이에 대해 꼼꼼하게 파악하지 않습니다.

SELECT id, name, section
  FROM tbl_names
  JOIN tbl_section USING (id)

경우 id의 유일한 공통 열 이름 tbl_namestbl_section, 당신도 사용할 수 있습니다 NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

참조 : https://dev.mysql.com/doc/refman/5.7/en/join.html



3

이미 질문에 대한 많은 답변이 있습니다. 이렇게 할 수도 있습니다. 테이블에 별칭 이름을 지정하고 다음과 같이 선택 쿼리에서 사용할 수 있습니다.

SELECT a.id, b.id, name, section
FROM tbl_names as a 
LEFT JOIN tbl_section as b ON a.id = b.id;

0

두 테이블에있는 ID의 형식이 다른 경우이를 조인 할 수 있습니다. 따라서 하나의 기본 테이블에서 ID를 사용하도록 선택할 수 있습니다 (예 : table_customesand 가 있고 table_orders주문의 ID는 " 101 " 과 같음 ). " 102 "... " 110 ", 고객 용으로 사용

select customers.id, name, amount, date from customers.orders;

-1
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.