Join
需要幫助將兩個表與具有計數子句的連接
我是一個網路人,所以對此我深表歉意….我有兩個表需要加入並從中提取名稱。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列,而無需在另一個子句中複製它們。
附加條款:
- 使用短表別名以獲得更好的可讀性。
- 對日期或日期和時間文字使用與區域設置/區域性無關的日期格式,例如*
YYYYMMDD
日期和YYYYMMDD HH:MM:SS.nnn…
*/或日期時間。 否則,沒有人會確定是什麼意思。是還是?最重要的是,引擎可以將其轉換為任何這些日期,具體取決於各種(連接、數據庫和伺服器)設置。*YYYY-MM-DD*T*HH:MM:SS.nnn…*
'12/01/2015'``12th-Jan-2015``Dec-1st-2015
- 用分號結束您的 SQL 語句。