SQL查询疑难解答
我有一个患者活动表,记录患者从入院到出院的所有活动。这是table命令SQL查询疑难解答,sql,sql-server,Sql,Sql Server,我有一个患者活动表,记录患者从入院到出院的所有活动。这是table命令 Create table activity ( activityid int PRIMARY KEY NOT NULL, calendarid int admissionID int, activitydescription varchar(100), admitTime datetime, dischargetime datetime, foreign key (admissionID
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,该组许可ID都会重复。对于给定的calendarid,许可SID是唯一的。为了进行分析,我想编写一个查询来显示admissionid、calendarid、admissionime和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
当我单独分配号码时,它会工作,否则会出现以下消息:
子查询返回了多个值
我做错了什么?
DISTINCT
不返回一行,它返回所有DISTINCT行(给定select子句中提供的列)。这就是为什么要从子查询返回多个值
您在子查询中寻找什么?如果使用
TOP 1
而不是DISTINCT
,应该可以,但可能不是您要查找的。DISTINCT
不返回一行,它会返回所有DISTINCT行(给定select子句中提供的列)。这就是为什么要从子查询返回多个值
您在子查询中寻找什么?如果您使用
TOP 1
而不是DISTINCT
,这应该可以工作,但可能不是您想要的。您的错误消息说明了很多。显然,中的一个(或两个)投影子查询(选择不同的查询)返回多个值。因此,列输入法
,分别<代码>放电时间无法与结果进行比较
一种可能是将子查询限制为1行。但是,此错误也可能表明数据库设计中存在结构问题
尝试:
或
你的错误信息说明了很多。显然,中的一个(或两个)投影子查询(选择不同的查询)返回多个值。因此,列
输入法
,分别<代码>放电时间无法与结果进行比较
一种可能是将子查询限制为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
试试这个
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
这应该可以满足您的需求,与子查询相比,性能损失要小一些:
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
选择a1.admissionId
,a1.calendarid
,a2.1
,a3.放电时间
来自活动a1
左连接活动a2
在a1.calendarid=a2.calendarid上
和a2.1-1
左加入活动a3
在a1.calendarid=a3.calendarid上
和a3.放电时间-1
其中a1.calendarid=100
这应该可以满足您的需求,与子查询相比,对性能的影响要小一些:
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
选择a1.admissionId
,a1.calendarid
,a2.1
,a3.放电时间
来自活动a1
左连接活动a2
在a1.calendarid=a2.calendarid上
和a2.1-1
左加入活动a3
在a1.calendarid=a3.calendarid上
和a3.放电时间-1
其中a1.calendarid=100
以这种方式使用时,子查询必须只返回一条记录(如错误消息中明确说明的)。如果您在activityID
上添加top1
和orderby
,它看起来会执行您想要的操作。根据测试数据,看起来您可以完全避免子查询,并将和activitID=1
添加到Where
子句中。Where-incaintime!=-1和放电时间!=-1应该会有帮助…您可以为此创建sql FIDLE吗?或者提供查询以创建所有必要的表和一些示例行?当以这种方式使用时,子查询必须只返回一条记录(如错误消息中明确说明的)。如果您在activityID
上添加top1
和orderby
,它看起来会执行您想要的操作。根据测试数据,看起来您可以完全避免子查询,并将和activitID=1
添加到Where
子句中。Where-incaintime!=-1和放电时间!=-1应该会有帮助…您可以为此创建sql FIDLE吗?或者提供查询以创建所有必要的表和一些示例行?如果没有Order By
子句,则无法保证不会将-1作为输入时间
或放电时间
。然后我希望看到SQL FIDLE!这可能回答了op的问题!盲目地给出-1是不公平的!!我在其中一个博客上读到,它太不成熟了!可能是因为这个原因,在我解释了原因之后,我给了-1,尽管我没有明确说明我是那个给分数的人。这是你的电话号码。此外,下面没有一个答案有一个order by子句为什么不否决它们呢!你能告诉我理想的输出是什么吗!!?假设ōnaraTop(1)确实有帮助,但我必须使用ORDERBY子句来提取正确的数据。谢谢大家如果没有Order By
子句,您不能保证不会将-1作为准入时间
或放电时间
。那么我想看看SQL FIDLE!这可能回答了op的问题!盲目地给出-1是不公平的!!我在其中一个博客上读到,它太不成熟了!可能是因为这个原因,在我解释了原因之后,我给了-1,尽管我没有明确说明我是那个给分数的人。这是你的电话号码。此外,下面没有一个答案有一个order by子句为什么不否决它们呢!你能告诉我理想的输出是什么吗!!?假设ōnaraTop(1)确实有帮助,但我必须使用ORDERBY子句来提取正确的数据。谢谢大家