2013-12-10 262 views
0

我需要使用嵌套查詢列出規定青黴素的最年輕病人的名字和姓氏。以下是我有DB2 SQL嵌套查詢

SELECT P.FIRST_NAME, P.LAST_NAME, MIN(P.AGE) AS AGE 
FROM PATIENT AS P 
WHERE P.PATIENT_NO IN(
    SELECT PRE.PATIENT_NO 
    FROM PRESCRIPTION AS PRE 
    WHERE MEDICATION_CODE IN (
      SELECT M.MEDICATION_CODE 
      FROM MEDICATION AS M 
      WHERE MEDICATION_DESC = 'Penicillin')) 
GROUP BY P.FIRST_NAME, P.LAST_NAME 
HAVING MIN(P.AGE); 

結果回來與所規定的青黴素,而不僅僅是最年輕的兩個人。

+0

我懷疑你可以用它做一個連接,發表您的表架構 – Mihai

+0

查詢是找到每個誰曾經被青黴素規定最低年齡的人。我假設每個病人只有一個年齡;) – swasheck

+0

我不認爲你的「HAVING」正在完成你想要的東西......但是,除了這個,我很驚訝你沒有收到錯誤信息, HAVING MIN(P.AGE);',因爲它打算給出一個布爾結果(帶有真/假結果的邏輯短語)。例如,HAVING MIN(P.AGE)<20'將是「HAVING」的完整語法。 –

回答

2

爲什麼你必須使用嵌套查詢?

在任何情況下,having子句沒有按照您的要求做。你可以得到你想要的東西做這個:

SELECT P.FIRST_NAME, P.LAST_NAME, MAX(P.AGE) as AGE 
FROM PATIENT AS P 
WHERE P.PATIENT_NO IN (
    SELECT PRE.PATIENT_NO 
    FROM PRESCRIPTION AS PRE 
    WHERE MEDICATION_CODE IN (
      SELECT M.MEDICATION_CODE 
      FROM MEDICATION AS M 
      WHERE MEDICATION_DESC = 'Penicillin' 
          ) 
    ) 
GROUP BY P.FIRST_NAME, P.LAST_NAME 
ORDER BY MAX(P.AGE) 
FETCH FIRST 1 ROWS ONLY; 

編輯:

其實,我同意FloChanz和group by可能是沒有必要的(除非你需要刪除重複項):

SELECT P.FIRST_NAME, P.LAST_NAME, P.AGE 
FROM PATIENT AS P 
WHERE P.PATIENT_NO IN (
    SELECT PRE.PATIENT_NO 
    FROM PRESCRIPTION AS PRE 
    WHERE MEDICATION_CODE IN (
      SELECT M.MEDICATION_CODE 
      FROM MEDICATION AS M 
      WHERE MEDICATION_DESC = 'Penicillin' 
          ) 
    ) 
ORDER BY P.AGE 
FETCH FIRST 1 ROWS ONLY; 
+0

最後一行缺少某些內容,並且出現錯誤。 – user1873736

+0

您應該在select語句和GROUP BY中添加P.AGE,以便能夠在此列上使用ORDER BY。但我認爲,小組小組在你的情況下是有用的。 – FloChanz

1

我想這一些內部聯接可能是這樣的美好:

SELECT P.FIRST_NAME, P.LAST_NAME, P.AGE 
FROM MEDICATION AS M 
INNER JOIN PRESCRIPTION AS PRE on PRE.MEDICATION_CODE = M.MEDICATION_CODE 
INNER JOIN PATIENT AS P on P.PATIENT_NO = PRE.PATIENT_NO 
WHERE M.MEDICATION_DESC = 'Penicillin' 
ORDER BY P.AGE 
FETCH FIRST 1 ROWS ONLY; 
+0

不需要嵌套查詢。做得好。 – WarrenT

1

想通了。感謝所有的建議

SELECT P.FIRST_NAME, P.LAST_NAME 
FROM PATIENT AS P 
WHERE P.AGE IN (
SELECT MIN(P.AGE) 
FROM PATIENT AS P 
WHERE P.PATIENT_NO IN(
SELECT PRE.PATIENT_NO 
FROM PRESCRIPTION AS PRE 
WHERE MEDICATION_CODE IN (
     SELECT M.MEDICATION_CODE 
     FROM MEDICATION AS M 
     WHERE MEDICATION_DESC = 'Penicillin'))); 
+0

的確很棒。 –