2014-03-18 174 views
2

我有一个患者活动表,它记录患者从患者入院到患者出院时的每个活动。下面是表命令疑难解答SQL查询

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,该组admissionid重复。对于给定的calendarid,admissionsid(s)是唯一的。对于我的分析,我想编写一个查询来显示入场时间,日历时间,入场时间和出场时间。

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 

当我单独分配的数字,它的工作原理,否则就想出了这样的信息:

子查询返回多个值。

我在做什么错?

+0

当以这种方式使用子查询必须只返回一个记录(如明确规定错误消息)。看起来好像你在'activityID'上添加'Order By'的'top 1',它会做你想做的。根据测试数据,它看起来像你可以完全避免子查询,并且将'和activitID = 1'添加到'Where'子句中。 –

+0

其中admitTime!= -1和卸载时间!= -1应该有帮助... –

+0

你可以为此创建一个sql小提琴吗?或者可能提供查询来创建所有必要的表格和一些示例行? –

回答

-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 
+0

如果没有'Order By'子句,你不能保证你不会将-1作为'admitTime'或'dischargeTime'。 –

+0

然后我想看看SQL的小提琴!这可能已经回答了问题!盲目地给-1是不公平的!我在其中一个缺乏成熟度的博客上阅读!可能是由于这个原因 –

+0

我给出-1后,我解释了推理,虽然我没有明确说明我是一个降低了标记。这里是[sqlfiddle](http://sqlfiddle.com/#!3/fb279/2/0)。另外[排序阅读](http://blog.sqlauthority.com/2007/09/24/sql-server-order-of-result-set-of-select-statement-on-clustered-indexed-table-when-按顺序不被使用/) –

0

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

你在寻找哪些子查询?如果您使用TOP 1而不是DISTINCT,那应该有效,但它可能不是您要查找的内容。

0

你的错误信息告诉了很多。显然,(SELECT DISTINCT查询中的)一个(或两个)投影子查询返回多个值。因此,列admitTimedischargeTime无法与结果进行比较。

一种可能性是限制你的子查询为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 
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