1052: Kolom 'id' pada daftar field ambigu

99

Saya memiliki 2 tabel. tbl_namesdan tbl_sectionyang memiliki idbidang di dalamnya. Bagaimana cara saya memilih idbidang, karena saya selalu mendapatkan kesalahan ini:

1052: Column 'id' in field list is ambiguous

Inilah pertanyaan saya:

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

Saya bisa memilih semua bidang dan menghindari kesalahan. Tapi itu akan menjadi pemborosan dalam performa. Apa yang harus saya lakukan?

Wern Ancheta
sumber

Jawaban:

156

SQL mendukung kualifikasi kolom dengan mengawali referensi dengan nama tabel lengkap:

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

... atau alias tabel:

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

Alias ​​tabel adalah pendekatan yang disarankan - mengapa mengetik lebih dari yang Anda harus?

Mengapa Kueri Ini Terlihat Berbeda?

Kedua, jawaban saya menggunakan sintaks ANSI-92 JOIN (milik Anda ANSI-89). Meskipun mereka melakukan hal yang sama, sintaks ANSI-89 tidak mendukung gabungan OUTER (RIGHT, LEFT, FULL). Sintaks ANSI-89 harus dianggap usang, ada banyak di SO yang tidak akan memilih sintaks ANSI-89 untuk memperkuatnya. Untuk informasi lebih lanjut, lihat pertanyaan ini .

OMG Ponies
sumber
Membingungkan! Karena tidak ada yang benar-benar dihapus dari bahasa SQL, SQL-89 adalah bagian yang tepat dari SQL-92. Sintaks OP adalah sintaks SQL-92 yang valid (dan. Kecuali saya kehilangan sesuatu, sintaks Anda adalah sintaks SQL-89 yang valid). Saya menganggap INNER JOINakan 'disusutkan' sejak SQL-92 diperkenalkan NATURAL JOIN.
onedaywhen
17

Dalam SELECTpernyataan Anda, Anda perlu mengawali id ​​Anda dengan tabel yang ingin Anda pilih.

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

ATAU

SELECT tbl_section.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id
Taryn
sumber
Ini hanya mengembalikan salah satu idbidang; OP menyatakan "cukup pilih semua bidang dan hindari kesalahan." Dan, saya tidak memilih sintaks ANSI-89.
OMG Ponies
Setuju tapi pertanyaannya adalah bagaimana memilih field id.
Taryn
6

Anda akan melakukannya dengan memberikan nama yang memenuhi syarat, misalnya:

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

Yang akan memberi Anda id dari tbl_names

halfdan
sumber
Lihat komentar saya untuk jawaban bluefeet
OMG Ponies
Ini bukan 'nama yang sepenuhnya memenuhi syarat', ini adalah variabel rentang. Saat Anda menghilangkan variabel rentang eksplisit, SQL menghasilkan variabel yang sama dengan nama tabel. Untuk lebih melihat apa yang saya maksud, ubah FROMklausa Anda ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- itulah yang dilakukan parser untuk menghasilkan variabel rentang.
onedaywhen
4

Solusi paling sederhana adalah menggabungkan dengan, USINGbukan ON. Dengan begitu, basis data "tahu" bahwa kedua idkolom sebenarnya sama, dan tidak akan mempermasalahkannya:

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

Jika idadalah satu-satunya nama kolom yang umum di tbl_namesdan tbl_section, Anda bahkan dapat menggunakan NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

Lihat juga: https://dev.mysql.com/doc/refman/5.7/en/join.html

vog
sumber
3

Apa yang mungkin Anda benar-benar ingin lakukan di sini adalah menggunakan operator serikat seperti ini:

(select ID from Logo where AccountID = 1 and Rendered = 'True')
  union
  (select ID from Design where AccountID = 1 and Rendered = 'True')
  order by ID limit 0, 51

Berikut dokumen untuk itu https://dev.mysql.com/doc/refman/5.0/en/union.html

Bryan Legend
sumber
3

Sudah ada banyak jawaban untuk pertanyaan Anda, Anda juga bisa melakukannya seperti ini. Anda dapat memberi tabel Anda nama alias dan menggunakannya dalam kueri pemilihan seperti ini:

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

Jika format id dalam dua tabel bervariasi maka Anda ingin menggabungkannya, karena itu Anda dapat memilih untuk menggunakan id dari satu tabel utama, misalnya jika Anda memiliki table_customesdan table_orders, dan id untuk pesanan seperti " 101 ", " 102 " ... " 110 ", cukup gunakan satu untuk pelanggan

select customers.id, name, amount, date from customers.orders;
Festole
sumber
-1
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
nikunj
sumber