我已经指定了不同的表名以避免歧义仍然存在错误

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 中的列。显然,您的两个表 tblEmployeetblTransaction 都有 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

我不确定您是否真的需要TOPNOT EXISTS 是一种更自然的查询方式:

select distinct t.EmployeeNumber
from tblTransaction T 
where not exists (select 1
                  from tblEmployee E
                  where E.EmployeeNumber = T.EmployeeNumber
                 );

【讨论】:

以上是关于我已经指定了不同的表名以避免歧义仍然存在错误的主要内容,如果未能解决你的问题,请参考以下文章

我已经为从我的表名中获取记录编写了这段代码是所有者...但是发生了一些错误...是不是缺少某些东西?

SQL语法基础之create

mysql 对 efcore 的表名大小写敏感

Hibernate中的ManyToMany映射引用错误(由api生成的表名)表Spring Boot

在ASP.Net Core中避免“请求匹配多个操作导致歧义”错误

sequelize 给出了错误的表名