【问题标题】:Query returning same row twice as result查询返回同一行两次作为结果
【发布时间】:2015-07-16 17:54:12
【问题描述】:

我正在学习如何编写 sql join 并编写了以下查询。

SELECT patient.name, patient.address, patient.CONTACTNUMBER, patient.disease,
patient.joining FROM patient INNER JOIN add_doctor ON patient.DOCASSIGN = 4534543

我得到的结果是

**NAME  ADDRESS     CONTACTNUMBER   DISEASE JOINING**
sdfdvd  sdfdfbdfgd  3243453         sdvdvbd 01-JUL-15
sdfdvd  sdfdfbdfgd  3243453         sdvdvbd 01-JUL-15

我对为什么返回两个相同的行作为我的查询结果感到困惑。请让我知道我该如何解决它,也请帮助我理解为什么它会打印同一行两次

病人表

ID       NAME         DISEASE    ADDRESS    CONTACTNUMBER   DOCASSIGN   ROOMASSIGN  JOINING    DISCHARGE
5656    sdfdvd       sdvdvbd    sdfdfbdfgd       3243453    4534543      General    01-JUL-15   15-JUL-15
65654   rgdgdgvds   sdfdfdgdfdb 1123fdffdbfd    4556767      4545            VIP    08-JUL-15   15-JUL-15

医生桌

ID          NAME    ADDRESS        EMAIL    CONTACT       SPECIALITY    SALARY  PASSWORD
4534543 fggfhdfs    rgghfgjfdj  gfhgfhjg    4365457567  dfsfhgjgkgfk    435435  safgdgd
4545    aaaaaaaaa   dffgdsg       fdfgds    43535       dffssgdhgd      324234  dfdhgggfdh

【问题讨论】:

  • 把两张表都包含进去,我们可以查看数据
  • 提供 RDBMS(MySQL、Oracle、SQL-Server 等)、示例数据和表结构。
  • 您的患者表中必须有两行 DOCASSIGN 的值为 4534543。
  • patient.DOCASSIGN = 4534543 此记录在您的表中出现 2 次。
  • 连同数据过滤条件一起给出连接过滤条件。根据两个表中的列连接过滤条件。

标签: sql oracle


【解决方案1】:

在 TSQL 中,INNER join 在 2 个逻辑阶段进行评估

  1. 交叉连接
  2. ON 子句中过滤掉不满足过滤条件的行。

如果表 Patient 有类似的行:

NAME    ADDRESS     CONTACTNUMBER   DISEASE JOINING   DOCASSIGN
dfdvd   sdfdfbdfgd  3243453         sdvdvbd 01-JUL-15 4534543

而表 add_doctor 的行如下:

DOCNAME
Test   
Test2  

所以对于内部连接,首先将完成交叉连接,中间结果如下:

Step1: patient Cross JOIN add_doctor 

这将导致1*2 = 2 行为:

NAME    ADDRESS     CONTACTNUMBER   DISEASE JOINING   DOCASSIGN DOCNAME 
dfdvd   sdfdfbdfgd  3243453         sdvdvbd 01-JUL-15 4534543   Test    
dfdvd   sdfdfbdfgd  3243453         sdvdvbd 01-JUL-15 4534543   Test2    

Filerting based on ON 子句的第二个逻辑阶段,因为两行都符合过滤条件

Step2: ON patient.DOCASSIGN = 4534543

最终结果有两行重复数据:

NAME    ADDRESS     CONTACTNUMBER   DISEASE JOINING
sdfdvd  sdfdfbdfgd  3243453         sdvdvbd 01-JUL-15
sdfdvd  sdfdfbdfgd  3243453         sdvdvbd 01-JUL-15

要删除重复数据,请使用 DISTINCT 关键字并将查询重写为:

SELECT DISTINCT p.name,
                p.address, 
                p.CONTACTNUMBER, 
                p.disease,
           p.joining 
FROM patient as p 
INNER JOIN add_doctor a ON p.DOCASSIGN = 4534543

您可以参考处理查询的不同逻辑阶段here...

【讨论】:

  • 嗨 Mini,感谢您的回答,这不起作用,我收到错误为 ORA-00933: SQL command not properly ended,我正在使用 oracle db
【解决方案2】:

您正在查询的“患者”表至少包含两行,其中包含姓名、地址、CONTACTNUMBER、疾病、加入等相同值的条目。这实际上是一个数据完整性问题。患者表不应包含这两行。如果你想在结果中只显示一行,你可以使用distinct()

SELECT distinct(patient.name), 
       patient.address, 
       patient.CONTACTNUMBER, 
       patient.disease,
       patient.joining 
FROM patient INNER JOIN add_doctor 
    ON patient.DOCASSIGN = 4534543

【讨论】:

  • 嗨 Tobias,非常感谢你,这正如预期的那样工作得很棒。我有一个小问题,distinct 将消除所有重复值,但为什么在我的输出中我得到一个重复的行,我的意思是不使用 distinct 的任何方式。
  • DISTINCTNOT 一个函数。它始终适用于选择列表中的所有列。将单列放在括号中不会改变任何事情。您的查询相当于select distinct patient.name, (patient.address), ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多