从多个表中选择时的不明确的列名称

时间:2016-06-29 19:17:41

标签: sql sql-server database

我正在使用SQL Server 2012,在从不同表中选择UserName期间,我收到以下错误:

  

消息209,级别16,状态1,行6不明确的列名称'用户名'

SELECT *
FROM   Signup,
       Pers_D,
       Edu_D,
       Dep_S
WHERE  UserName LIKE '%Hwl123%';

3 个答案:

答案 0 :(得分:3)

这不可能以这种方式实现。逗号说 - 你正试图加入这些表格。不是工会。

您收到错误Ambiguous column name 'UserName',因为有几个表包含该名称的列,而服务器不知道应用此过滤器的位置。

在简单的陈述中,解决方案可能如下:

SELECT *
FROM   Signup as s
WHERE  s.UserName LIKE '%Hwl123%'

UNION ALL

SELECT *
FROM   Pers_D as p
WHERE  p.UserName LIKE '%Hwl123%'

UNION ALL

SELECT *
FROM   Edu_D as e
WHERE  e.UserName LIKE '%Hwl123%'

UNION ALL

SELECT *
FROM   Dep_S as d
WHERE  d.UserName LIKE '%Hwl123%'

这就是你想要做的事情。

但是你的方法正引导你到那里:

SELECT s.*, p.*, e.*, d.*
FROM   Signup s
INNER JOIN Pers_D p ON p.??? = s.???
INNER JOIN Edu_D e on e.??? = ???
INNER JOIN Dep_S d on d.??? = ???
WHERE  [???].UserName LIKE '%Hwl123%' ---<<< ambiguity: s.UserName? p.UserName? e.UserName? d.UserName?

答案 1 :(得分:1)

UserName位于多个表中。尝试使用别名

我也没有看到加入,你会得到比预期更多的东西

SELECT *
FROM Signup A,Pers_D B,Edu_D C,Dep_S D
WHERE A.UserName LIKE '%Hwl123%';

答案 2 :(得分:0)

该语法实际上为您提供了一个交叉连接,即每个表中的每一行TIMES其他表中的每一行。可能不是你想要的。

SELECT *为您提供了4个表中的每一列。这些表中至少有2个具有用户名列。

查看注册表中列的简单方法是

SELECT TOP 10 * from Signup

您可以在每个表上使用它来查看哪些表中包含UserName。

您可以对表进行ALIAS,然后在WHERE列中指定要将UserName与哪个表进行比较。例如:

SELECT *
FROM   Signup AS S,
       Pers_D AS P,
       Edu_D AS E,
       Dep_S AS D
WHERE  P.UserName LIKE '%Hwl123%';

除非您正在使用CROSS JOIN,否则您应该根据表共享的列将该查询重写为一系列JOIN。