1052: Cột 'id' trong danh sách trường không rõ ràng


94

Tôi có 2 bàn. tbl_namestbl_sectioncó cả idtrường trong chúng. Làm cách nào để tiếp tục chọn idtrường, vì tôi luôn gặp lỗi này:

1052: Column 'id' in field list is ambiguous

Đây là truy vấn của tôi:

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

Tôi chỉ có thể chọn tất cả các trường và tránh lỗi. Nhưng đó sẽ là một sự lãng phí trong hiệu suất. Tôi nên làm gì?

Câu trả lời:


152

SQL hỗ trợ định tính một cột bằng cách thêm tiền tố tham chiếu bằng tên bảng đầy đủ:

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

... hoặc bí danh bảng:

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

Bí danh bảng là cách tiếp cận được khuyến nghị - tại sao bạn phải nhập nhiều hơn?

Tại sao các truy vấn này trông khác nhau?

Thứ hai, câu trả lời của tôi sử dụng cú pháp ANSI-92 JOIN (của bạn là ANSI-89). Trong khi chúng hoạt động giống nhau, cú pháp ANSI-89 không hỗ trợ các phép nối OUTER (RIGHT, LEFT, FULL). Cú pháp ANSI-89 nên được coi là không được dùng nữa, có nhiều người trên SO sẽ không bỏ phiếu cho cú pháp ANSI-89 để củng cố điều đó. Để biết thêm thông tin, hãy xem câu hỏi này .


Gây nhầm lẫn! Bởi vì không có gì thực sự bị xóa khỏi ngôn ngữ SQL, SQL-89 là một tập hợp con thích hợp của SQL-92. Cú pháp của OP là cú pháp SQL-92 hợp lệ (và. Trừ khi tôi thiếu cái gì đó, cú pháp của bạn là cú pháp SQL-89 hợp lệ). Tôi coi INNER JOINlà 'mất giá' kể từ khi SQL-92 được giới thiệu NATURAL JOIN.
onedaywhen

16

Trong SELECTtuyên bố của mình, bạn cần đặt trước id của mình với bảng mà bạn muốn chọn nó.

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

HOẶC LÀ

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

Điều này chỉ trả về một trong các idtrường; OP nói rằng "chỉ cần chọn tất cả các trường và tránh lỗi." Và, tôi không bỏ phiếu cho cú pháp ANSI-89.
OMG Ponies

Đồng ý nhưng câu hỏi là làm thế nào để chọn trường id.
Taryn

6

Bạn sẽ làm điều đó bằng cách cung cấp một tên đủ điều kiện, ví dụ:

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

Điều này sẽ cung cấp cho bạn id của tbl_names


Xem bình luận của tôi cho câu trả lời của bluefeet
OMG Ponies

Nó không phải là 'tên đủ điều kiện', nó là một biến phạm vi. Khi bạn bỏ qua một biến phạm vi rõ ràng, SQL sẽ tạo một biến giống như tên bảng. Để hiểu rõ hơn ý tôi, hãy thay đổi FROMmệnh đề của bạn ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- đó là điều mà trình phân tích cú pháp đang làm để tạo một biến phạm vi.
onedaywhen

4

Giải pháp đơn giản nhất là tham gia với USINGthay vì ON. Bằng cách đó, cơ sở dữ liệu "biết" rằng cả hai idcột thực sự giống nhau và sẽ không đánh giá cao điều đó:

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

Nếu idlà tên cột phổ biến duy nhất trong tbl_namestbl_section, bạn thậm chí có thể sử dụng NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

Xem thêm: https://dev.mysql.com/doc/refman/5.7/en/join.html



3

Đã có rất nhiều câu trả lời cho câu hỏi của bạn, Bạn cũng có thể làm như thế này. Bạn có thể đặt tên bí danh cho bảng của mình và sử dụng tên đó trong truy vấn chọn như sau:

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

0

Nếu định dạng của id trong hai bảng khác nhau thì bạn muốn kết hợp chúng, vì vậy bạn có thể chọn sử dụng một id từ một bảng chính, giả sử nếu bạn có table_customestable_ordersvà id đó cho các đơn hàng như " 101 ", " 102 " ... " 110 ", chỉ sử dụng một cho khách hàng

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.