2016-04-18 16 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によって非常にうまく説明されています。ここでは、INTERVALを使うのではなく、きれいなDATE関数を使うことができます。コードはこのようにきれいに見えます。また、過去1年間のデータが必要なので、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

これは悪い構文です...参加、うん – DanK

+1

をJOINを使用は、同様にトリックを行う可能性があります。お気軽に再入力してください。 ;)かなりの時間、私は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_VISITでなければならないとき、VisitにDiagnosis FKを入れます –