0

这个问题涉及2个表:

表格1:

PatientMaster:

PatientId,
PatientName

表2:

MedicineMaster:

MedicineId,
PatientId,
MedicineName

在表2中,要存储多个单个患者的药物......

但我只需要表 2 中的患者 ID 和患者姓名 ..

我的问题是,

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

4 回答 4

2

对我来说,您似乎在关注有药物的患者的详细信息。我会使用以下查询:

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

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

于 2013-08-01T01:46:19.387 回答
0

在 SQL 中,GROUP BY 实际上需要一个聚合函数,以便 SQL 解析器了解您要执行的操作。

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

选择 Pat.PatientName, COUNT(med.MedicineId), from drugmaster as med join PatientMaster as Pat on med.PatientId = Pat.PatientId group by Pat.PatientName

显然这不是您想要的,因为上面的 SQL 现在将向您显示 PatientName 和他们的 MedicineID 计数。如果你想查看实际的 ID,那么你需要这样的东西......

选择 Pat.PatientName, med.MedicineId, COUNT(*) as RowCount from drugmaster as med 加入 PatientMaster as Pat on med.PatientId = Pat.PatientId group by Pat.PatientName, med.MedicineId

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

于 2013-08-01T01:24:49.473 回答
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

于 2013-08-01T06:07:19.847 回答
0

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

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

表格1:

患者(患者 ID、患者姓名)

表 2:

医学(MedicineID、MedicineName)

表3:

患者药物(MedicineID、PatientID)

表三被称为相交表,它们几乎总是以自己的方式作为一个实体结束,存储更多数据。在这种情况下,您可能会将该表重命名为“处方”之类的名称,并且它最终可能会存储诸如处方日期、有效期、处方医生、剂量等信息。

并根据您的编辑进行更新:您现在需要的只是:

SELECT PatientID, PatientName FROM Patients
于 2013-08-01T01:25:44.920 回答