Неоднозначное название столбца - правда ли? - PullRequest
4 голосов
/ 21 октября 2011

Если я хочу написать запрос с простым соединением, я могу сделать это:

select * from customer c
join order o
on c.customerid = o.customerid
where c.customerid = 100

и все работает нормально. В этом запросе есть причина, почему я должен указать псевдоним таблицы - т.е. c.customerid? Почему я не могу просто написать это:

select * from customer c
join order o
on c.customerid = o.customerid
where customerid = 100

Я получаю ошибку Ambiguous column name 'customerid'. В этом случае, когда в предложении WHERE есть только один столбец, и это столбец, к которому я присоединяюсь, это действительно «неоднозначно»? Или это просто для того, чтобы соответствовать ANSI-стандарту (я думаю, здесь - я не знаю, соответствует ли он) и поощрять хорошие соглашения по кодированию?

Ответы [ 6 ]

6 голосов
/ 21 октября 2011

Для вашего конкретного примера я не могу вспомнить какие-либо обстоятельства, в которых это имело бы значение. Однако для INNER JOIN в строковом столбце это может быть сделано следующим образом.

DECLARE @customer TABLE
(customerid CHAR(3) COLLATE Latin1_General_CI_AS)

INSERT INTO @customer VALUES('FOO');

DECLARE @order TABLE
(customerid CHAR(3) COLLATE Latin1_General_CS_AS)

INSERT INTO @order VALUES('FOO');


SELECT * 
FROM @customer c
JOIN @order o
ON c.customerid = o.customerid COLLATE Latin1_General_CS_AS
WHERE c.customerid = 'Foo' /*Returns 1 row*/

SELECT * 
FROM @customer c
JOIN @order o
ON c.customerid = o.customerid COLLATE Latin1_General_CS_AS
WHERE o.customerid = 'Foo' /*Returns 0 rows*/
5 голосов
/ 21 октября 2011

Отсутствие псевдонима таблицы действительно приводит к неоднозначной ссылке на столбец. Просто сделайте ваш join a left join, и вы сразу поймете, почему:

select * from customer c
left join order o
on c.customerid = o.customerid
where customerid = 100 -- here, the semantics are quite different

Другая причина: один столбец может быть типа INTEGER, другой - типа SMALLINT. Какой из них использовать для фильтра? (Это может иметь последствия для плана выполнения). Еще лучший пример дает Мартин Смит

Таким образом, в целом, вы не получите много пользы, сделав SQL более «прощающим», и в то же время введете новые источники ошибок. Что вы могли бы сделать с некоторыми базами данных (не SQL Server), однако это:

select * from customer c
join order o
using (customerid)
where customerid = 100

Или вот это (если customerid - единственное общее имя столбца)

select * from customer c
natural join order o
where customerid = 100
1 голос
/ 21 октября 2011

Вы получаете сообщение об ошибке, поскольку столбец customerid существует в таблицах заказов и клиентов, а SQL не знает, к какому столбцу должно применяться условие.

0 голосов
/ 21 октября 2011

Неоднозначная ошибка столбца возникает только тогда, когда нам нужно выполнить какую-то операцию с полем, содержащим более одной таблицы, поэтому в этом случае SQL не может распознать, из какой таблицы он должен работать.

0 голосов
/ 21 октября 2011

Ну ... вы знаете, что набор результатов будет содержать только записи с точно таким же customerid, а сервер базы данных - нет, потому что он не "понимает", что вы указываете.И если у вас было объединение, в котором оба набора не имеют одинаковых значений в наборе результатов, вы будете рады, что сервер их различает.;)

0 голосов
/ 21 октября 2011

После JOINing двух таблиц, результирующая таблица содержит 2 столбца с одинаковым именем customerid.Таким образом, вы должны указать предложению WHERE, какой столбец использовать, добавив имя таблицы в качестве префикса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...