2014-03-18 233 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