我已经指定了不同的表名以避免歧义仍然存在错误
Posted
技术标签:
【中文标题】我已经指定了不同的表名以避免歧义仍然存在错误【英文标题】:I have already specified different table names to avoid ambiguity still error exists 【发布时间】:2021-09-05 22:19:49 【问题描述】:With tbl_name as
(Select top(1000) *
from tblEmployee as E right join tblTransaction as T
on E.EmployeeNumber = T.EmployeeNumber
where E.EmployeeNumber is null
order by T.EmployeeNumber)
Select Distinct(T.EmployeeNumber) as EmployeeNum from tbl_name
我得到的错误:-
消息 8156,级别 16,状态 1,第 24 行“员工编号”列是 为“tbl_name”指定了多次。
【问题讨论】:
这就是您不使用*
的原因,定义您在SELECT
中的列。显然,您的两个表 tblEmployee
和 tblTransaction
都有 EmployeeNumber
列,而您的 SELECT *
声明您想要两者。
你加入两个表都有EmployeeNumber
列,然后返回它们...这是错误
另外Distinct(T.EmployeeNumber)
是一个有点奇怪的语法。 DISTINCT
不是函数,而是运算符。它应用于整个数据集。将DISTINCT
之后列出的列放在括号中,看起来就像您认为DISTINCT
做了其他事情。
@Marco 在选择语句中我指定了 T.EmployeeNumber 以消除歧义,当您运行在“With”语句下指定的查询时,它给了我想要的结果。编译器在哪里感到困惑这种情况?
@Larnu 得到了不同的部分,但仍然对查询感到困惑。
【参考方案1】:
问题是您在联接中的两个表中都有相同的列。而不是SELECT TOP(1000) *
指定正确表中的列名。如果 2 个表具有相同的列名,并且您在结果集中需要这两个表,请为其中一个列指定不同的别名。像这样的
WITH tbl_name
AS (SELECT TOP (1000)
E_EmployeeNumber = E.EmployeeNumber ,
T_EmployeeNumber = T.EmployeeNumber
FROM tblEmployee AS E
RIGHT JOIN tblTransaction AS T ON E.EmployeeNumber = T.EmployeeNumber
WHERE E.EmployeeNumber IS NULL
ORDER BY T.EmployeeNumber)
SELECT DISTINCT
(T_EmployeeNumber) AS EmployeeNum
FROM tbl_name;
另外,查看查询,下面的查询也将比您当前的查询更好
SELECT
*
FROM tblEmployee E
WHERE EXISTS
(
SELECT 1 FROM tblTransaction T WHERE EmployeeNumber = E.EmployeeNumber
)
这会以更好的性能给出相同的结果
【讨论】:
【参考方案2】:完全不清楚tblTransaction
中的员工编号如何不存在。如果您正确声明了外键关系,则不会发生这种情况。
你可以使用你的查询结构,但我推荐LEFT JOIN
:
with tbl_name as (
select top (1000) T.EmployeeNumber
from tblTransaction T left join
tblEmployee E
on E.EmployeeNumber = T.EmployeeNumber
where E.EmployeeNumber is null
order by T.EmployeeNumber
)
Select Distinct EmployeeNumber
from tbl_name;
您的查询有几个问题:
select *
正在执行完全错误消息提示的操作。有多个同名的列。
外部查询对T.EmployeeNumber
的引用中的T
未定义。
您在DISTINCT
周围使用括号,就好像它是一个函数一样。它不是。 SQL 中有一个语法元素是SELECT DISTINCT
。
我不确定您是否真的需要TOP
。 NOT EXISTS
是一种更自然的查询方式:
select distinct t.EmployeeNumber
from tblTransaction T
where not exists (select 1
from tblEmployee E
where E.EmployeeNumber = T.EmployeeNumber
);
【讨论】:
以上是关于我已经指定了不同的表名以避免歧义仍然存在错误的主要内容,如果未能解决你的问题,请参考以下文章
我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是不是缺少某些东西?
Hibernate中的ManyToMany映射引用错误(由api生成的表名)表Spring Boot