1052: Alan listesindeki 'id' sütunu belirsiz


99

2 masam var. tbl_namesve tbl_sectioniçlerinde her ikisi de var id. idAlanı seçmeye nasıl devam ederim , çünkü her zaman şu hatayı alıyorum:

1052: Column 'id' in field list is ambiguous

İşte benim sorgum:

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

Tüm alanları seçip hatayı önleyebilirim. Ancak bu performans kaybı olur. Ne yapmalıyım?

Yanıtlar:


156

SQL, referansın önüne tam tablo adı ekleyerek bir sütunun nitelendirilmesini destekler:

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

... veya bir tablo takma adı:

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

Tablo diğer adı önerilen yaklaşımdır - neden gerekenden daha fazlasını yazasınız?

Bu Sorgular Neden Farklı Görünüyor?

İkinci olarak, cevaplarım ANSI-92 JOIN sözdizimini kullanıyor (sizinki ANSI-89). Aynısını gerçekleştirirken, ANSI-89 sözdizimi OUTER birleşimleri (RIGHT, LEFT, FULL) desteklemez. ANSI-89 sözdizimi kullanımdan kaldırılmış olarak kabul edilmelidir, SO'da bunu güçlendirmek için ANSI-89 sözdizimine oy vermeyecek birçok kişi var. Daha fazla bilgi için bu soruya bakın .


Kafa karıştırıcı! Aslında SQL dilinden hiçbir şey kaldırılmadığından, SQL-89, SQL-92'nin uygun bir alt kümesidir. OP'nin sözdizimi geçerli SQL-92 sözdizimi (ve. Bir şeyi kaçırmıyorsam, sizinki geçerli SQL-89 sözdizimidir). INNER JOINSQL-92 piyasaya çıktığından beri 'amortismana tabi tutulmayı' düşünüyorum NATURAL JOIN.
2018

17

Senin içinde SELECTdeyimi size onu seçmek istiyorum masaya ile id önsöz gerekir.

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

VEYA

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

Bu yalnızca idalanlardan birini döndürür ; OP, "yalnızca tüm alanları seçin ve hatayı önleyin" anlamına gelir. Ve ANSI-89 sözdizimine oy vermiyorum.
OMG Ponies

Kabul edildi, ancak soru kimlik alanının nasıl seçileceğiydi.
Taryn

6

Bunu tam olarak nitelenmiş bir ad sağlayarak yaparsınız, örneğin:

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

Bu size tbl_names'in kimliğini verir


Bluefeet'in cevabına yaptığım yorumu görün
OMG Ponies

Bu 'tam olarak nitelenmiş bir isim' değil, bir aralık değişkenidir. Açık bir aralık değişkenini atladığınızda, SQL tablo adıyla aynı olan bir değişken üretir. Ne demek istediğimi daha iyi anlamak için, FROMcümlenizi değiştirin ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- ayrıştırıcının bir aralık değişkeni oluşturmak için yaptığı şey budur.
2018

4

En basit çözüm, USINGyerine bir birleştirmedir ON. Bu şekilde, veritabanı her iki idsütunun da aslında aynı olduğunu "bilir" ve bu konuyu değerlendirmez:

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

Eğer idtek ortak sütun adıdır tbl_namesve tbl_section, hatta kullanabilirsiniz NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

Ayrıca bkz .: https://dev.mysql.com/doc/refman/5.7/en/join.html


3

Muhtemelen burada gerçekten yapmak istediğiniz şey, sendika operatörünü şu şekilde kullanmaktır:

(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

İşte bunun için belgeler https://dev.mysql.com/doc/refman/5.0/en/union.html


3

Zaten sorunuzun bir çok cevabı var, bunu da yapabilirsiniz. Tablonuza bir takma ad verebilir ve bunu seçme sorgusunda aşağıdaki gibi kullanabilirsiniz:

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

0

İki tablodaki kimliklerin formatı değişirse, onlara katılmak isteyebilirsiniz, bu nedenle tek ana tablodan bir kimlik kullanmayı seçebilirsiniz, örneğin table_customesve varsa ve table_ordersemirler için kimlik " 101 " gibidir, " 102 " ... " 110 ", müşteriler için yalnızca birini kullanın

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.