As you know, if we select two tables whereas we have the same column name, we get the error:
‘Ambiguous column name ‘ColumnName»
I already know that setting the alias does fix this issue.
However, it seems if the name of the column is not in the SELECT statement, then it works for SQL Server 2008 R2 (on my database). Compatibility-Level is set to 100.
So the following statement DOES work:
SELECT t1.ID
FROM Table1 t1
JOIN Table2 t2 ON (t2.ID = t1.ID)
ORDER BY ID
But apparently in other circumstances the above statement does return an error (I know this because it happened at the customer’s site). Also on SQL Fiddle it returns the error both on SQL Server 2008 and SQL Server 2012.
Does anybody know why or in which circumstances the above query still returns the error?
My guess is that it’s a matter of version or settings on the SQL Server.
Note: The linked duplicate did solve my problem. Compatibility level was set to 80. Changing it to 100 solved the problem.
Дайте таблицам псевдоним
Иногда вам может потребоваться объединить две таблицы в SQL, и в таблицах есть столбцы с одинаковыми именами.
В этом случае, если вы объедините две таблицы и запустите запрос, не различая имена одинаковых столбцов, вам будет видна ошибка «Столбец с неоднозначным именем».
Как решить эту проблему?
Простой.
Есть несколько способов исправить ошибку «столбец неоднозначного имени». Один из простейших способов ее решения описан ниже.
Как устранить ошибку «столбец неоднозначного имени» в SQL
Например, вы хотите объединить две таблицы с именами TABLE1 и TABLE2. ТАБЛИЦА 1 содержит эти столбцы — EmployeeID, Name, Salary. В ТАБЛИЦЕ 2 есть эти столбцы — EmployeeID, Name, Age.
Во-первых, давайте создадим таблицы.
Обратите внимание, что две таблицы имеют общий столбец «Имя», кроме EmployeeID, который всегда является числом.
А теперь давайте присоединимся к столам. Выполните запрос ниже:
Если вы запустите вышеуказанный запрос, вы получите эту ошибку — «Столбец с неоднозначным именем».
Это означает, что два столбца имеют одинаковое имя столбца — это столбец «Имя». Машина SQL не понимает, какое «Имя» из двух таблиц вы имеете в виду. Это неоднозначно — непонятно.
Чтобы прояснить это, добавьте псевдоним одной или обеих таблиц TABLE1 или TABLE2 к столбцам с одинаковыми именами. Вы заметили выше, что псевдоним TABLE1 — A, а псевдоним TABLE2 — B.
Итак, давайте исправим ошибку.
Запустите запрос. Нет ошибки!
Вы можете пойти дальше, определив, какое «Имя» попадает в ТАБЛИЦУ2, написав свой запрос следующим образом:
Заключение
Вы можете давать столбцам с одинаковыми именами разные имена. Это может затруднить идентификацию содержимого столбца. Название столбца должно описывать содержимое столбца.
Один из простейших способов решить ошибку «столбца с неоднозначным именем» — без изменения имени столбца — это дать таблицам, к которым вы хотите присоединиться, псевдоним. Это отправляет четкую информацию на SQL-машину, столбцы разные.
Удачных запросов.
Спасибо за ваше время.
Когда вы объединяете несколько таблиц в SQL-запросе, если столбец с одинаковым именем присутствует в обеих таблицах, то BigQuery не знает, какой из них использовать (если вы явно не скажете об этом), поэтому он выдает ошибку с неоднозначным именем столбца.
Редактор Bigquery WebUI достаточно умен, чтобы выделить точную строку, в которой присутствует неоднозначный столбец (обратите внимание на красное восклицание на полях редактора sql). Решение может быть в одном из приведенных ниже методов:
Убедитесь, что в списке выбора нет неоднозначных имен столбцов:
select Id, Name, Description from table1 t1 join table2 t2 on t2.Id = t1.Id;
В этом примере Идентификатор имени столбца присутствует в обеих таблицах, t1 и t2. Вы можете прояснить это, разметив столбцы, как показано ниже:
select t1.Id, t1.Name, t2.Description from table1 t1 join table2 t2 on t2.Id = t1.Id;
Убедитесь, что предложение Where / Join не имеет двусмысленных имен столбцов:
select t1.Id, t1.Name, t2.Description from table1 t1 join table2 t2 on t2.Id = t1.Id Where Id = 100;
В этом примере, поскольку идентификатор присутствует в обеих таблицах, создайте псевдоним столбца, как показано ниже:
select t1.Id, t1.Name, t2.Description from table1 t1 join table2 t2 on t2.Id = t1.Id Where t1.Id = 100;
Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный синтаксис Join:
select table1.* from table1, table2, table3 where table1.Id = table2.Id;
Использование запятых для Join(соединений) может сбивать с толку, приводить к ошибкам и данный метод имеет меньшую читабельность. Всегда старайтесь использовать явное объединение и явные столбцы объединения. Это значительно сократит количество ошибок, а также упростит работу по устранению неполадок
Неоднозначное имя столбца
У меня есть следующий SQL, и он выдает ошибку неоднозначное имя столбца ‘ id ‘
select tbl_registration.*, tbl_ebp.name as ebp_name, tbl_Users.id as user_id, tbl_ebp.id as linked_ebp_id
from tbl_registration
left outer join tbl_ebp on tbl_ebp.id = tbl_registration.ebp_id
left outer join tbl_users on tbl_registration.email = tbl_users.username
where id = [PARAM]p_id
Я прочитал несколько статей об этом, но не могу найти рабочего решения для моего кода.
Любая помощь очень ценится.
665
5
5 ответов:
Ваш идентификатор предложения WHERE должен быть более конкретным, включая имя таблицы:
WHERE table.id = [PARAM]p_id
Если две вещи имеют одно и то же имя, то здесь вступает в действие двусмысленность. В этом случае несколько таблиц в SQL содержат столбец «id».
SQL обладает интеллектом для устранения неоднозначности имен столбцов, если имя столбца уникально в текущем наборе таблиц, к которым прикасаются, — следовательно, в большинстве случаев вам не нужно префиксировать имена столбцов именами таблиц.
Скорее всего, несколько таблиц имеют столбец с именем id; используйте префикс таблицы в предложении where
Вы пробовали добавить префикс имени столбца id в предложении where?
Это относится к » id » в вашем предложении where. Вам нужно указать, какой «id» таблицы он должен фильтровать.
Я заменил ваш код
select *, tbl_ebp.name as ebp_name, tbl_Users.id as user_id, tbl_ebp.id as linked_ebp_id from tbl_registration left outer join tbl_ebp on tbl_ebp.id = tbl_registration.ebp_id left outer join tbl_users on tbl_registration.email = tbl_users.username where your_respective_tblname.id = your_respective_tblname.[PARAM]p_id
] 1
CREATE VIEW planView
SELECT
planID, planName, cost, quota, maxSpeed, shapedSpeed, typeID, typeName
FROM
Plans AS p
LEFT OUTER JOIN
accessType AS a ON p.typeID = a.typeID;
GO
Это продолжает выдавать мне сообщение об ошибке, я пытался сделать два typeID равными друг другу, но все равно ничего
3 ответа
Лучший ответ
У вас есть общий столбец в ваших таблицах. Это неоднозначно для SQL Server, потому что он не знает, к какой таблице принадлежит этот столбец.
Например, если у вас есть cost
как в plan
, так и в accessType
таблице, то вы не понимаете, что должно возвращаться — plan.cost
или accessType.cost
?
< Сильный > Решение:
Перейти к вашей select
строке
SELECT planID, planName, cost, quota, maxSpeed, shapedSpeed, typeID, typeName
И укажите имя таблицы с помощью оператора .
Я думаю, что проблема исходит от
typeID
В select, потому что вы использовали Left outer join
, поэтому значения typeID
в обеих таблицах не всегда одинаковы.
3
marc_s
1 Ноя 2017 в 05:49
Вы можете написать так:
CREATE VIEW planView
SELECT
planID, planName, cost, quota, maxSpeed, shapedSpeed, a.typeID, typeName
FROM
Plans AS p
LEFT OUTER JOIN
accessType AS a ON p.typeID = a.typeID;
GO
2
Md. Suman Kabir
1 Ноя 2017 в 05:53
CREATE VIEW planView
SELECT p.planID, p.planName, p.cost, p.quota, p.maxSpeed, p.shapedSpeed, a.typeID, a.typeName
FROM Plans AS p LEFT OUTER JOIN accessType AS a
ON p.typeID = a.typeID;
GO
Ваш запрос должен быть таким.
-1
Muhammad Hannan
1 Ноя 2017 в 04:36