我有一个患者活动表,记录患者入院时直到患者出院的每项活动。这是表命令
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。
我做错了什么?
答案 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