SQL查询 - 如何通过查询包含不在“分组依据”中的列?

时间:2013-08-01 01:20:32

标签: sql

此问题涉及2个表:

表1:

PatientMaster:

PatientId,
PatientName

表2:

MedicineMaster:

MedicineId,
PatientId,
MedicineName
表2中列出了许多单身患者的药物......

但我只需要表2中的patientid和patientname ..

我的qry是,

select med.MedicineId,
       Pat.PatientName 
from medicinemaster as med 
  join PatientMaster as Pat on med.PatientId = Pat.PatientId 
group by Pat.PatientName

但错误来了,

  

列'medicinemaster.MedicineId'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

我是这样的结果:

PatientId  PatientName
3          xx
4          yy

4 个答案:

答案 0 :(得分:2)

对我来说,似乎你是在照顾病人的细节后才有药。我会使用以下查询:

SELECT DISTINCT pat.PatientId, pat.PatientName
FROM
MedicineMaster med 
INNER JOIN PatientMaster pat ON pat.PatientId = med.PatientId

由于您没有使用任何类型的聚合函数(sumcountavg等),因此您无需对数据进行分组。

答案 1 :(得分:0)

在SQL中,GROUP BY实际上需要一个聚合函数来让SQL解析器了解你想要做什么。

我建议你将SQL重新编码为这样......

选择Pat.PatientName,        COUNT(med.MedicineId) 来自医学博士 在med.PatientId = Pat.PatientId上加入PatientMaster作为Pat Pat.PatientName分组

显然这不是你想要的,因为上面的SQL现在会显示PatientName及其MedicineID计数。如果你想看到实际的ID,那么你需要这样的东西......

选择Pat.PatientName,        med.MedicineId,        COUNT(*)作为RowCount 来自医学博士 在med.PatientId = Pat.PatientId上加入PatientMaster作为Pat 由Pat.PatientName,med.MedicineId

组成

RowCount列将显示上面的JOIN创建记录复合体的次数。

答案 2 :(得分:0)

还没有足够的信息来回答你的问题。

但我至少可以为您的架构提供一些帮助。当前的架构设计是错误的。你应该有三个表:

表1:

  

患者(PatientID,PatientName)

表2:

  医学(MedicineID,MedicineName)

表3:

  

PatientMedicines(MedicineID,PatientID)

表3称为交叉表,它们几乎总是作为一个实体结束,存储更多数据。在这种情况下,您可能会将该表重命名为“处方”,并最终可能存储处方日期,到期日期,处方医生,剂量等信息。

基于您的编辑的更新:您现在需要的只是:

SELECT PatientID, PatientName FROM Patients

答案 3 :(得分:0)

正如其他人所指出的,你实际上并不需要MedicineMaster表。

但是,从患者表中选择也会向您显示尚未(尚未)服用任何药物的患者。因此,如果您想看到患者实际上得到药物,您需要使用IN子句过滤掉它们:

select PatientID, PatientName 
from Patients
where patientID in (select patientid 
                    from MedicineMaster);

或使用与EXISTS谓词相关的子查询:

select p.PatientID, p.PatientName 
from Patients p
where exists (select 1
              from MedicineMaster m 
              where m.patientID = p.patientId);

两者之间没有真正的区别 - 大多数现代DBMS优化器将生成相同的执行计划(这意味着它们将执行相同的操作)。如果你不熟悉使用MySQL,你应该使用第二个查询,因为MySQL在优化IN查询方面非常糟糕。