【问题标题】:SQL Query ClarificationSQL 查询说明
【发布时间】:2013-07-16 13:20:54
【问题描述】:

我有两张表医生和计费。我希望查看治疗一名以上患者的医生的 dname、doctorid 和 sum(fees)。

医生表列如下:

doctorid,dname

帐单列如下:

billid,patientid,doctorid,fees

我尝试了以下代码。但出现错误提示 SQL cmd 未正确结束:

SELECT d.dname,b.doctorid,Sum(b.fees)as "TotalFees" FROM billing b,doctor d ON b.doctorid=d.doctorid
GROUP BY b.doctorid HAVING count(b.patientid)>1; 

我的语法哪里出错了? 谢谢...

【问题讨论】:

  • 不要混用语法,尝试FROM billing b INNER JOIN doctor dLEFT JOIN 显示没有账单的医生。
  • this question 的副本。这个更清楚:-)

标签: sql


【解决方案1】:

FROM billing b,doctor d ON b.doctorid=d.doctorid 应该是 FROM billing b inner join doctor d ON b.doctorid=d.doctorid

【讨论】:

  • 没有关键字join就不能进行join吗?
  • 可以,但严格来说不是join。它是一个笛卡尔积(取决于 DBMS 的优化器可能会在运行时转换为连接)。在这种情况下,请记住在 WHERE 子句中指定连接条件 b.doctorid = d.doctorid
  • 你可以做完全连接然后添加一个 where 子句,这看起来像 Xavi 的第二个例子
【解决方案2】:

试试这个

SELECT d.dname,b.doctorid,Sum(b.fees)as "TotalFees" FROM billing b inner join doctor d ON b.doctorid=d.doctorid
GROUP BY d.dname,b.doctorid HAVING count(b.patientid)>1; 

【讨论】:

    【解决方案3】:

    您必须在查询中提及您要使用哪个连接,您必须更改您的查询,例如

    SELECT d.dname, b.doctorid, Sum(b.fees) as "TotalFees" 
    FROM billing b inner join doctor d ON b.doctorid=d.doctorid
    GROUP BY d.dname, b.doctorid HAVING count(b.patientid)>1;
    

    查看Join

    【讨论】:

      【解决方案4】:

      您缺少INNER JOIN 关键字,并且您还需要GROUP BY 您在SELECT 子句中使用的所有非聚合列(在本例中为GROUP BY d.dname, b.doctorid)。

      另外,这可能是一个错字,但Sum(b.fees)as 之间没有空格:

      SELECT d.dname, b.doctorid, Sum(b.fees) as "TotalFees" 
      FROM billing b INNER JOIN doctor d ON b.doctorid=d.doctorid
      GROUP BY d.dname, b.doctorid HAVING count(b.patientid)>1; 
      

      请记住,在FROM 子句中使用逗号分隔的表名将执行笛卡尔积,这将成为性能杀手,具体取决于您的 RDBM 优化器。如果您想使用它,请记住将其连接条件放在 WHERE 子句中(ON 子句与 JOIN 语法一起使用):

      SELECT d.dname, b.doctorid, Sum(b.fees) as "TotalFees" 
      FROM billing b, doctor d 
      WHERE b.doctorid = d.doctorid
      GROUP BY d.dname, b.doctorid HAVING count(b.patientid)>1; 
      

      【讨论】:

      • 非常感谢哈维非常有帮助。 :)
      • @Dixon 很高兴有帮助 :) 我看到您已经提出了一些问题,但尚未接受任何问题的答案。请记住,对于这个或其他问题的整个社区和未来的访问者来说,有一个明确接受的答案是非常有价值的。请看一下How does accepting an answer work?。并记得为有用的答案投票并接受解决您问题的答案。
      猜你喜欢
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      相关资源
      最近更新 更多