Join

需要幫助將兩個表與具有計數子句的連接

  • May 12, 2020

我是一個網路人,所以對此我深表歉意….我有兩個表需要加入並從中提取名稱。pt_basic 有我需要的患者姓名和程式碼,ptc_diagnosis 有他們的診斷。我需要提取只有一個診斷的患者的姓名。我可以加入 Patient_id 上的表格。這是我寫的:

select 
PTC_DIAGNOSIS.PATIENT_ID, 
PT_BASIC.PATIENT_CODE, 
PT_BASIC.NAME_FIRST, 
PT_BASIC.NAME_LAST 
from PTC_DIAGNOSIS 
inner join PT_BASIC on PTC_DIAGNOSIS.PATIENT_ID=PT_BASIC.PATIENT_ID
where PTC_DIAGNOSIS.create_date>'12/01/2015' 
group by PTC_DIAGNOSIS.patient_id 
having COUNT(*)=1

我得到錯誤Column 'PT_BASIC.NAME_FIRST' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

我已經移動了列,嘗試先使用 pt_basic,然後以 15 種不同的方式重新編寫它,每次都出現類似的錯誤。我覺得我很接近,但也許不是。

謝謝

非常接近只有忘記了 GROUP BY 列

嘗試這個:

select 
PTC_DIAGNOSIS.PATIENT_ID, 
PT_BASIC.PATIENT_CODE, 
PT_BASIC.NAME_FIRST, 
PT_BASIC.NAME_LAST 
from PTC_DIAGNOSIS 
inner join PT_BASIC on PTC_DIAGNOSIS.PATIENT_ID=PT_BASIC.PATIENT_ID
where PTC_DIAGNOSIS.create_date>'12/01/2015' 
group by 
PTC_DIAGNOSIS.PATIENT_ID, 
PT_BASIC.PATIENT_CODE, 
PT_BASIC.NAME_FIRST, 
PT_BASIC.NAME_LAST 
having COUNT(*)=1

正如Patrick7 已經說過的,您需要 GROUP BY 來包含 SELECT 列表中的所有非聚合列。

但是,在您的情況下,有一種方法可以避免複製 GROUP BY 中的所有 SELECT 列。您可以先分別聚合PTC_DIAGNOSIS行:

SELECT
 patient_id
FROM
 PTC_DIAGNOSIS 
WHERE
 create_date > '20151201'     -- or '20150112', whatever that '12/01/2015' means
GROUP BY
 patient_id
HAVING
 COUNT(*)=1

然後將該查詢用作派生表並將其連接到PT_BASIC

SELECT
 p.PATIENT_ID,
 p.PATIENT_CODE, 
 p.NAME_FIRST, 
 p.NAME_LAST 
FROM
 (
   SELECT
     PATIENT_ID
   FROM
     PTC_DIAGNOSIS 
   WHERE
     create_date > '20151201'     -- or '20150112', whatever that '12/01/2015' means
   GROUP BY
     patient_id
   HAVING
     COUNT(*)=1
 ) AS d
 INNER JOIN PT_BASIC AS p ON d.PATIENT_ID = p.PATIENT_ID
;

結果將與 Patrick 的查詢相同,這樣您就可以在輸出中包含任意數量的PT_BASIC列,而無需在另一個子句中複製它們。

附加條款:

引用自:https://dba.stackexchange.com/questions/134531