2016-04-18 106 views
-1

我創建了一家醫院的數據庫,並且「管理層想知道去年有多少人被診斷患有癌症」。Oracle中的SQL查詢

CREATE TABLE patients (
ID_patients INTEGER NOT NULL, 
Name VARCHAR NOT NULL 
); 

CREATE TABLE visit(
ID_visit INTEGER NOT NULL, 
DATE_visit DATE NOT NULL, 
FK_patients INTEGER NOT NULL, 
); 

    CREATE TABLE Diagnosis(
ID_Diagnosis INTEGER NOT NULL, 
FK_disease INTEGER NOT NULL 
FK_visit INTEGER 
); 

CREATE TABLE Disease(
ID_disease INTEGER NOT NULL, 
Name_disease VARCHAR NOT NULL 
); 

現在,我們需要弄清楚:使病人得到了去年診斷出患有癌症。 我使用下面的查詢來獲得去年訪問過的患者,但我不知道如何針對癌症患者?我想我應該使用「VIEW AS」,但我不確定。

SELECT * 
FROM Visit 
WHERE Date_Visit BETWEEN 
(CURRENT_DATE - interval '2' year) AND CURRENT_DATE - INTERVAL '1' YEAR; 

回答

0

如Dank所說的很好。在這裏,我們可以使用一些乾淨的DATE函數,而不是使用INTERVAL。代碼看起來更清潔,我們也希望過去一年的數據,因此我假設您需要2015年1月1日至2015年12月31日的數據。希望在下面的代碼片幫助。

SELECT COUNT(v.FK_patients) 
FROM visit v 
JOIN Diagnosis d on d.ID_Diagnosis = v.FK_diagnosis --Here is where you connect the tables 
WHERE v.Date_Visit BETWEEN 
TRUNC(ADD_MONTHS(SYSDATE,-12),'YEAR') AND TRUNC(SYSDATE,'YEAR')-1 ; 
0

這應該是直截了當我猜...:

select pa.ID_patients, pa.Name 
    from patients pa, visit vi, Diagnosis dia, Disease dis 
    where vi.FK_patients = pa.ID_patients 
    and dia.ID_Diagnosis = vi.FK_diagnosis 
    and dis.ID_disease = dia.FK_disease 
    and upper(dis.Name_disease) like '%CANCER%' 

只需添加您的日期篩選到它,它應該表現出期望的結果...

+0

這是壞的語法...使用JOIN – DanK

+1

是的,加入也可以做到這一點。隨時重新輸入。 ;)相當一段時間,我不得不使用oracle,但是當時老公司使用了我以上使用的語法 – Tyron78

+0

'JOIN'實際上是一個ANSI標準,所以它不是特定於Oracle。您在WHERE子句中的上述連接仍然會解析,但現在認爲這種連接表過期的做法已過時。它與舊的Oracle'(+)'和'( - )'外部連接語法類似......他們提出了一種更好的方法,但是爲了向後兼容而保留舊的方法。 – DanK

1

假設你只需要患者數,並且您已經知道如何定義癌症,您需要使用JOIN將這些表連接在一起:

SELECT COUNT(v.FK_patients) 
FROM visit v 
JOIN Diagnosis d on d.ID_Diagnosis = v.FK_diagnosis --Here is where you connect the tables 
WHERE v.Date_Visit BETWEEN 
     (CURRENT_DATE - interval '2' year) AND CURRENT_DATE - INTERVAL '1' YEAR 
AND FK_disease IN(--Your list of cancer ids); 
+0

嘿,我犯了一個錯誤。我在Diagnosis中將診斷FK放入,當它在診斷中應該是FK_VISIT時 –