2013-12-10 265 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

的确很棒。 –