2017-03-14 2 views
0

Ich arbeite an Postgres und die folgende Abfrage scheint nie zu beenden, aber es ist nur das letzte OR, das ein Problem verursacht, läuft es gut, wenn ich es auskommentieren. Ist es nur eine ineffiziente Art, es zu schreiben? Wenn dem so ist, kann ich mir keine Alternative vorstellen.SQL Multiple ODER BETWEENS

SELECT a.subject_id, a.hadm_id, a.admittime, d.icd9_code, l.short_title, d.seq_num 
FROM mimiciii.admissions a 
INNER JOIN mimiciii.diagnoses_icd d 
ON a.subject_id = d.subject_id 
AND a.hadm_id = d.hadm_id 
INNER JOIN mimiciii.d_icd_diagnoses l 
ON d.icd9_code = l.icd9_code 
WHERE a.subject_id IN 
    (SELECT DISTINCT d.subject_id 
    FROM mimiciii.diagnoses_icd d 
    WHERE d.icd9_code BETWEEN '390%' and '459%') 
    AND d.icd9_code NOT IN 
    (SELECT d.icd9_code 
     FROM mimiciii.diagnoses_icd d 
     WHERE d.icd9_code BETWEEN 'V01%' AND 'V91%' 
     OR d.icd9_code BETWEEN 'E000%' AND 'E999%' 
     OR d.icd9_code BETWEEN '630%' AND '679%' 
     OR d.icd9_code BETWEEN '760%' AND '999%' 
     ) 
ORDER BY subject_id, admittime 

Antwort

0

Warum ist überhaupt eine Unterabfrage erforderlich?

Was ist das, was Sie wollen?

SELECT a.subject_id, a.hadm_id, a.admittime, d.icd9_code, l.short_title,  d.seq_num 
FROM mimiciii.admissions a 
INNER JOIN mimiciii.diagnoses_icd d 
ON a.subject_id = d.subject_id 
AND a.hadm_id = d.hadm_id 
INNER JOIN mimiciii.d_icd_diagnoses l 
ON d.icd9_code = l.icd9_code 

WHERE d.icd9_code BETWEEN '390%' and '459%' 
and not (d.icd9_code BETWEEN 'V01%' AND 'V91%') 
and not (d.icd9_code BETWEEN 'E000%' AND 'E999%') 
and not (d.icd9_code BETWEEN '630%' AND '679%') 
and not (d.icd9_code BETWEEN '760%' AND '999%')  
ORDER BY subject_id, admittime 

Oder irre ich mich irgendwo?

2

Vielleicht ein Grund, warum es nie beendet Ausführung, weil die BETWEEN s Filter alle Zeilen aus. Sie können keine Platzhalter mit BETWEEN verwenden.

Die gesamte Unterabfrage scheint unnötig. Sie können es einfach entfernen. Versuchen Sie, diese where Klausel:

WHERE a.subject_id IN (SELECT d.subject_id 
         FROM mimiciii.diagnoses_icd d 
         WHERE d.icd9_code >= '390' and 
          d.icd9_code < '460' 
        ) 

Wenn ein Code dieser übereinstimmt, dann ist es nicht Ihre anderen Bedingungen entsprechen.

Ich vermute, dass es andere Probleme mit der Abfrage gibt, aber dieser ist grell.

+0

Vielen Dank, aber die Platzhalter funktionieren. – Sam

+0

@Sam. . . Sie tun nicht, was du denkst, dass sie tun. Sie sind keine Platzhalter; Sie sind nur das "%", was wirklich irreführend für jeden ist, der die Abfrage liest (einschließlich Sie in der Zukunft). –

0
SELECT a.subject_id, a.hadm_id, a.admittime, d.icd9_code, l.short_title, d.seq_num 
FROM mimiciii.admissions a 
INNER JOIN mimiciii.diagnoses_icd d 
ON a.subject_id = d.subject_id 
AND a.hadm_id = d.hadm_id 
INNER JOIN mimiciii.d_icd_diagnoses l 
ON d.icd9_code = l.icd9_code 
WHERE a.subject_id IN 
    (SELECT DISTINCT d.subject_id 
    FROM mimiciii.diagnoses_icd d 
    WHERE d.icd9_code BETWEEN '390%' and '459%') 
    AND d.icd9_code NOT IN 
    (SELECT d.icd9_code 
     FROM mimiciii.diagnoses_icd d 
     WHERE (d.icd9_code BETWEEN 'V01%' AND 'V91%') 
     OR (d.icd9_code BETWEEN 'E000%' AND 'E999%') 
     OR (d.icd9_code BETWEEN '630%' AND '679%') 
     OR (d.icd9_code BETWEEN '760%' AND '999%') 
     ) 
ORDER BY subject_id, admittime 

Sie könnten versuchen, (habe es nicht getestet) Halterungen mit der Unterabfrage in diesem Fall bestellen, werden ihnen die Klammern auswerten zuerst, dann laufen die OR-Anweisung, um die Daten zu sammeln, in die äußeren Abfrage zu füttern.

+0

Danke, Klammern um die falschen Ergebnisse gebracht, aber der Kommentar oben funktioniert. – Sam