web-dev-qa-db-ja.com

1052:フィールドリストの列 'id'があいまいです

2つのテーブルがあります。 tbl_namestbl_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

すべてのフィールドを選択するだけで、エラーを回避できます。しかし、それはパフォーマンスの無駄になります。私は何をすべきか?

77
Wern Ancheta

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構文は非推奨と見なされるべきです。SOには、それを補強するANSI-89構文に投票しない人が多くいます。 詳細については、この質問をご覧ください

133
OMG Ponies

SELECTステートメントでは、選択するテーブルをIDの前に付ける必要があります。

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

OR

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

次のように、完全修飾名を指定することでそれを行うことができます。

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

これはtbl_namesのIDを提供します

6
halfdan

すでにあなたの質問にはたくさんの答えがあります。あなたもこのようにできます。テーブルにエイリアス名を付け、次のように選択クエリで使用できます。

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

おそらくここで本当にやりたいことは、次のような共用体演算子を使用することです。

(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

こちらがそのドキュメントです https://dev.mysql.com/doc/refman/5.0/en/union.html

3
Bryan Legend

最も簡単な解決策は、USINGの代わりにONとの結合です。そうすれば、データベースは両方のid列が実際に同じであることを「認識」し、それを軽視しません。

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

idtbl_namesおよびtbl_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

2
vog

2つのテーブルのIDの形式が異なる場合は、それらを結合する必要があります。たとえば、table_customestable_ordersがあり、注文のIDが "- 101 "、" 102 "..." 11 "、顧客に1つだけを使用

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