得到错误的结果

时间:2012-08-03 12:50:34

标签: sql sql-server

Hospital_Visit
      hid pid HospitalName DoctorId
      41   1  abc        1
      42   2  xyx        2

Patient_Master
       pid  PatientName
       1        jill
       2        rosy
Doctor_Master
      DoctorID DoctorName
       1        John
       2        Jack
Hospital_Study
      sid  hid  exam  status
       1    41   jjj   sfvn
       2    41   fks   jdjd

select  Hospital_Visit.Pid,PatientName,DoctorName from Patient_Master
inner join Hospital_Visit on Hospital_Visit.pid=Patient_Master.pid
inner join Doctor_Master on Doctor_Master.DoctorID= Hospital_Visit.DoctorID
inner join Hospital_Study on Hospital_Study.hid=Hospital_Visit.hid

Pid PatientName  DoctorName exam status
1   Jill         John       jjj  sfvn
2   rosy         John       fks   jdjd

**

//Correct output i want
    Pid PatientName  DoctorName exam status
    1   Jill         John       jjj  sfvn
    2   rosy         Jack       fks   jdjd

**

我得错了结果重复医生  由于inner join隐藏在Hospital_Visit和Hospital_Study上的结果中的名称 我怎样才能解决这个问题


(DTU编辑 - 可用形式的当前样本数据):

create table Hospital_Visit(hid int,pid int,HospitalName char(3), DoctorId int)
insert into Hospital_Visit(hid, pid, HospitalName, DoctorId) values
      (41,   1,  'abc',        1),
      (42,   2,  'xyx',        2)

create table Patient_Master(pid int,  PatientName char(4))
insert into Patient_Master(pid,  PatientName) values
       (1,        'jill'),
       (2,        'rosy')
create table Doctor_Master(DoctorID int, DoctorName char(4))
insert into Doctor_Master(DoctorID, DoctorName) values
       (1,        'John'),
       (2,        'Jack')
create table Hospital_Study(sid int, hid int,  exam char(3),  status char(4))
insert into Hospital_Study(sid,  hid,  exam,  status) values
       (1,    41,   'jjj'   ,'sfvn'),
       (2,    41,   'fks'   ,'jdjd')

2 个答案:

答案 0 :(得分:0)

现在提供样本数据(revision 4),无法获得所需的输出。

现在,您的查询会返回:

Pid PatientName DoctorName
1   jill        John
1   jill        John

你想要的是这个:

//Correct output i want
Pid PatientName  DoctorName exam status
1   Jill         John       jjj  sfvn
2   rosy         Jack       fks   jdjd

...但Hospital_Study表中的数据与此不符,因为这两行都有hid = 41

Hospital_Study
  sid  hid  exam  status
   1    41   jjj   sfvn
   2    41   fks   jdjd

所以他们都引用了Hospital_Visit表中的第一行,该表属于名为“Jill”的患者。
- >有了这些数据,就不可能选择名为“玫瑰色”的患者,因为Hospital_Study表中没有一行引用玫瑰色的访问(hid = 42)。

要获得所需的输出,Hospital_Study中的数据必须如下所示:

Hospital_Study
  sid  hid  exam  status
   1    41   jjj   sfvn
   2    42   fks   jdjd
        /\
        ||
        this is different

使用此数据以及您问题中的确切查询,您会得到以下结果:

Pid PatientName DoctorName
1   jill        John
2   rosy        Jack

答案 1 :(得分:-2)

我对您的加入有疑问

inner join Hospital_Study on Hospital_Study.hid=Hospital_Visit.hid

Hospital_Study.hid是正确的外键,但是Hospital_Visit.hid是主键或是外键。

如果Hospital_Visit.hid是您的外键,那么您必须在医院的主表(Hospital_Master)上再添加一个内部联接。