SQL查询疑难解答

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

我有一个患者活动表,记录患者从入院到出院的所有活动。这是table命令

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子句来提取正确的数据。谢谢大家