此问题涉及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
答案 0 :(得分:2)
对我来说,似乎你是在照顾病人的细节后才有药。我会使用以下查询:
SELECT DISTINCT pat.PatientId, pat.PatientName
FROM
MedicineMaster med
INNER JOIN PatientMaster pat ON pat.PatientId = med.PatientId
由于您没有使用任何类型的聚合函数(sum
,count
,avg
等),因此您无需对数据进行分组。
答案 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
查询方面非常糟糕。