SQL查询疑难解答

时间:2014-03-18 17:36:30

标签: sql sql-server

我有一个患者活动表,记录患者入院时直到患者出院的每项活动。这是表命令

Create table activity
(  activityid int PRIMARY KEY NOT NULL,
   calendarid int
   admissionID int,
   activitydescription varchar(100),
   admitTime datetime,
   dischargetime datetime,
   foreign key (admissionID) references admission(admissionID)
)

数据如下所示:

     activityID   calendarid   admissionID    activitydescription    admitTime            dischargeTime 
       1             100           10             Patient Admitted     1/1/2013 10:15      -1
       2             100           10             Activity 1            -1                 -1
       3             100           10             Activity 2            -1                 -1
       4             100           10             Patient Discharged    -1                 1/4/2013 13:15

对于定义的每个calendarID,disposid重复集。对于给定的calendarid,admissionsid是唯一的。对于我的分析,我想写一个查询来显示admissionid,calendarid,admitTime和dischargetime。

 select admissionId, calendarid, admitTime=
         (select distinct admitTime 
         from activity a1 
         where a1.admisionID=a.admissionID and a1.calendarID=a.calendarid),
     dischargeTime=
         (select distinct dischargeTime 
         from activity a1 
         where a1.admisionID=a.admissionID and a1.calendarID=a.calendarid)
 from activity a
 where calendarid=100

当我单独指定数字时,它会起作用,否则会出现此消息:

  

子查询返回的值超过1。

我做错了什么?

4 个答案:

答案 0 :(得分:0)

DISTINCT不返回1行,它会返回给定您在select子句中提供的列的所有不同行。这就是为什么你从子查询中获得多个值的原因。

您在寻找子查询中的内容是什么?如果您使用的是TOP 1而不是DISTINCT,那应该可以使用,但它可能不是您正在寻找的内容。

答案 1 :(得分:0)

您的错误消息说明了很多。显然,(SELECT DISTINCT查询)中的一个(或两个)投影子查询返回多个值。因此,列admitTime,分别为。 dischargeTime无法与结果进行比较。

一种可能性是将子查询限制为1行。但是,此错误也可能表示数据库设计存在结构性问题。

尝试:

select top 1 admitTime 
from activity a1 
where a1.admisionID=a.admissionID and a1.calendarID=a.calendarid

select admitTime 
from activity a1 
where a1.admisionID=a.admissionID and a1.calendarID=a.calendarid
limit 1

答案 2 :(得分:0)

这可以让你得到你想要的,比子查询更少的性能:

select  a1.admissionId
        ,a1.calendarid
        ,a2.admitTime
        ,a3.dischargeTime
from    activity a1
left join activity a2
    on  a1.calendarid = a2.calendarid
    and a2.admitTime <> -1
left join activity a3
    on  a1.calendarid = a3.calendarid
    and a3.dischargeTime <> -1
where a1.calendarid=100

答案 3 :(得分:-1)

试试这个!

select admissionId, calendarid, admitTime=
         (select top(1) admitTime 
         from activity a1 
         where a1.admisionID=a.admissionID and a1.calendarID=a.calendarid),
     dischargeTime=
         (select top(1) dischargeTime 
         from activity a1 
         where a1.admisionID=a.admissionID and a1.calendarID=a.calendarid)
 from activity a
 where calendarid=100