【问题标题】:SQL Server query returning many cartesian productSQL Server 查询返回许多笛卡尔积
【发布时间】:2017-06-29 13:55:45
【问题描述】:

我有一个如下所示的 SQL Server 查询:

select 
    ISNULL(UPPER(w.role), '-') as 'Position Title',
    concat ('SGD ',m.expectedSalary) as 'Expected Salary',
    (cast(w.endYear as int) - cast(w.startYear as int)) as 'Experience',
    mq.Qualification as 'Education Level',
    ISNULL(ms.specialisation, '-') as 'Specialisation',
    mj.dateApplied as 'Date of Application'
from 
    WorkExpr w,
    Member m,
    MemberQlftn mq,
    MemberSpln ms,
    MemberJob mj
where 
    mj.jobNumber = (select jobNumber
                    from MemberJob
                    where email = 'alanang@gmail.com')

它应该向我返回申请与 alan 相同工作的人员的详细信息(例如职位图块、预期薪水等)(电子邮件为 'alanang@gmail.com')。然而,当我运行这个查询时,我得到了超过 6000 行的数据,而我应该只取回 4。谁能告诉我我做错了什么?谢谢

【问题讨论】:

  • 您确实意识到您没有加入这些表中的任何一个,对吗?
  • @GurV 我怎么知道它是否加入了?
  • 除了没有连接...所以我们可以看到从这些表中实际查询的内容,您能否将表别名前缀放在所有这些列名上(mj.role、m.expectedSalary、mj .endYear 等)
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 年前),不鼓励使用它

标签: sql sql-server cartesian-product


【解决方案1】:

好的,现在您需要在主键/外键上用 INNER JOINS 替换您的交叉连接表列表:

    from WorkExpr w,
    Member m,
    MemberQlftn mq,
    MemberSpln ms,
    MemberJob mj

替换为以下内容,但表之间的关系正确:

    from WorkExpr w
    inner join Member m
        on w.memberid = m.memberid
    inner join MemberQlftn mq 
        on w.memberid = mq.memberid
    inner join MemberSpln ms
        on w.memberid = ms.memberid
    inner join MemberJob mj
        on w.memberid = mj.memberid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多