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


94

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

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

回答:


152

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構文に投票しないSOの多くがいます。詳細については、この質問を参照してください


紛らわしい!実際にはSQL言語から何も削除されていないため、SQL-89はSQL-92の適切なサブセットです。OPの構文は有効なSQL-92構文です(私が何かを欠落していない限り、あなたの構文は有効なSQL-89構文です)。INNER JOINSQL-92が導入されて以来、私は「減価償却済み」であると考えていますNATURAL JOIN
18

16

あなたに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

これは1つのidフィールドのみを返します。OPは「すべてのフィールドを選択して、エラーを回避する」と述べています。また、ANSI-89構文には投票しません。
OMGポニー2011

同意しましたが、問題はidフィールドの選択方法でした。
タリン

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...これが、パーサーが範囲変数を生成するために行っていることです。
18

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

2つのテーブルのIDの形式が異なる場合は、それらを結合する必要があります。そのため、メインテーブルのIDを使用するように選択できます。たとえば、およびがtable_customesありtable_orders、注文のIDが「101」の場合、 " 102 " ... " 110 "、1つだけ使用してください

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.