【问题标题】:SQL Server duplicating results three timesSQL Server 重复结果三次
【发布时间】:2020-03-15 22:29:25
【问题描述】:

我正在尝试过滤我的结果以输出在部门 5 控制的所有项目中工作的人员的姓名。我认为我在下面写的内容会给我想要的结果,但它显示的人的姓名每次在这些项目上工作三遍。我该怎么做才能解决这个问题?

SELECT e.Fname, e.Minit, e.Lname
FROM EMPLOYEE AS e, DEPARTMENT as d, PROJECT as p
WHERE p.Dnum=d.Dnumber AND d.Dnumber=e.Dno AND p.Dnum=5

这会导致输出:

John    B   Smith
John    B   Smith
John    B   Smith
Franklin    T   Wong
Franklin    T   Wong
Franklin    T   Wong
Joyce   A   English
Joyce   A   English
Joyce   A   English
Ramesh  K   Narayan
Ramesh  K   Narayan
Ramesh  K   Narayan

【问题讨论】:

  • 你真的应该停止使用旧式逗号连接并转而使用正确的连接。
  • 您需要提供一些示例数据和预期结果,以便我们了解结果重复的原因 - 我们不知道您的数据结构。
  • 向我们展示一些示例表数据和预期结果 - 都是格式化文本,而不是图像。
  • 是的 @howimetmyself ,这是您的查询给您的结果的图像。但是现在您应该通过编辑您的问题并将其添加为文本而不是图像来将该结果添加到您的问题中。另外,添加您从中获得此结果的数据?你不需要为每张表写10行数据,只要两三行就足够代表你的问题了……最后请不要加图,加文字。

标签: sql sql-server sql-server-2017


【解决方案1】:

似乎您有一个多对一的关系,并且在执行 ANSI-89(即 1989 年)连接时没有考虑到这一点。因此,由于表 DEPARTMENTPROJECT 中加入了多行,因此每个 Employee 获得了多行。

考虑到您只在SELECT 中引用EMPLOYEE,我假设您实际上想要一个EXISTS

SELECT e.Fname,
       e.Minit,
       e.Lname
FROM dbo.EMPLOYEE E
WHERE E.Dno = 5 --Inferred as p.Dnum=5 and p.Dnum=d.Dnumber and d.Dnumber=e.Dno. Thus e.Dno = 5
  AND EXISTS (SELECT 1
              FROM dbo.DEPARTMENT D
                   JOIN dbo.PROJECT P ON D.Dnumber = P.Dnum
              WHERE D.Dnumber = E.Dno);

但是,如果您不关心 Employee 是否有部门(或项目),那么以下方法就可以了:

SELECT e.Fname,
       e.Minit,
       e.Lname
FROM dbo.EMPLOYEE E
WHERE E.Dno = 5;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多