TSQL在期望多个时返回一行

时间:2009-12-09 03:38:27

标签: sql tsql stored-procedures

我有两张桌子,一张病人桌和一张预约桌。我正在尝试从两个表中检索信息,具体取决于当时登录的医生。我的存储过程如下:

ALTER PROCEDURE dbo.sprocGetAllAppointmentsForUser
@UserID varchar(50)
   AS
SELECT Appts.appt_id, Appts.patient_id, Appts.dr_id, Appts.appt_time, Appts.appt_reason, p.patient_id, 
p.patient_first_name, p.patient_last_name, p.patient_addr, p.patient_city, p.patient_zip,
p.patient_state, p.patient_phone, p.patient_healthcare, p.patient_diagnosis, p.patients_user_id
FROM Patients p INNER JOIN Appts
ON Appts.patient_id = p.patients_user_id
WHERE Appts.dr_id = @UserID
RETURN

那应该让每次预约和患者信息都正确吗?或者我是在简化它。下面是一些样本数据:

预约表:

appt_id        patient_id        dr_id
   1               467             101
   2               242             101
   3               784             210

只返回第一行,即使有两行对应dr_id 101。

5 个答案:

答案 0 :(得分:1)

语法看起来很合理,但是你确定在JOIN条件下你不是指p.patient_id而不是p.patients_user_id吗?虽然没有看到数据库图表但很难确定。

答案 1 :(得分:1)

您将获得该医生的所有预约(有患者) - 您也可以让患者参加这些预约。

如果预约没有患者,则不会出现。

如果患者没有预约,则不会出现。

如果患者与该医生预约2次,患者将出现两次。

如果预约有2名患者,预约将出现两次。

答案 2 :(得分:1)

您是否肯定您正在寻找的所有患者ID实际存在于患者表中?如果你改变这样的连接,你得到一个不同的结果集:

FROM Patients p 
RIGHT JOIN ApptsON Appts.patient_id = p.patients_user_id
WHERE Appts.dr_id = @UserID

答案 3 :(得分:1)

尝试逐步调查此事 第一

SELECT 
  *
FROM Appts
WHERE Appts.dr_id = 101

如果返回2行,则数据在appts表中是正常的

然后添加

SELECT
    a.patient_id
    ,p.*
FROM Appts A
LEFT JOIN Patients p 
    ON Appts.patient_id = p.patients_user_id
WHERE Appts.dr_id = 101

如果你看到p。* part中返回的空值,那么你的连接条件有问题,你可能会加入一个错误的字段。或患者表中缺少相应patient_id的患者记录

答案 4 :(得分:0)

粗略猜测

而不是Appts.patient_id = p.patients_user_id

尝试Appts.patient_id = p.patient_id