我有3个表,其中第一个主键是另一个表中的外键。
我想从第一个表中提取一个字段,然后从另一个表中提取一个字数,所有字段都使用pk和fk连接。这就是我到目前为止所做的:
SELECT MBDDX_STUDY.STUDY_NAME, COUNT(MBDDX_EXPERIMENT.STUDY_ID) AS NUMBER_OF_EXPERIMENTS
FROM MBDDX_STUDY
INNER JOIN MBDDX_EXPERIMENT
ON MBDDX_STUDY.ID=MBDDX_EXPERIMENT.STUDY_ID
INNER JOIN (SELECT COUNT(MBDDX_TREATMENT_GROUP.GROUP_NO) AS NUMBER_OF_GROUPS
FROM MBDDX_TREATMENT_GROUP)
ON MBDDX_TREATMENT_GROUP.STUDY_ID = MBDDX_STUDY.ID
group by MBDDX_STUDY.STUDY_NAME, MBDDX_TREATMENT_GROUP.STUDY_ID
但是,我得到一个错误,说倒数第二行中的MBDDX_TREATMENT_GROUP.STUDY_ID是无效的标识符。这是一张正确的表格。
请提出任何建议。
感谢。
答案 0 :(得分:2)
您收到错误是因为该列不在SELECT
中,因此它不能GROUP BY
它没有的字段。
答案 1 :(得分:0)
您无需按此字段进行分组(MBDDX_TREATMENT_GROUP.STUDY_ID
)。它应该只是group by MBDDX_STUDY.STUDY_NAME
答案 2 :(得分:0)
如果我的理解是正确的,你需要第一张表中的记录,并在其他两张表中记录相关记录。这就是答案
SQL:Getting count from many tables for a user record in USER table.Whats the best approach?
答案 3 :(得分:0)
看起来您需要为第二个子查询添加别名,并且需要包含要加入的内容。
看起来你也没有使用子查询中的count
。
试试这个:
SELECT MBDDX_STUDY.STUDY_NAME
, COUNT(MBDDX_EXPERIMENT.STUDY_ID) AS NUMBER_OF_EXPERIMENTS
FROM MBDDX_STUDY
INNER JOIN MBDDX_EXPERIMENT
ON MBDDX_STUDY.ID=MBDDX_EXPERIMENT.STUDY_ID
INNER JOIN (SELECT STUDY_ID, COUNT(MBDDX_TREATMENT_GROUP.GROUP_NO) AS NUMBER_OF_GROUPS
FROM MBDDX_TREATMENT_GROUP GROUP BY MBDDX_TREATMENT_GROUP.STUDY_ID) xx
ON xx.STUDY_ID = MBDDX_STUDY.ID
GROUP BY MBDDX_STUDY.STUDY_NAME, xx.STUDY_ID
答案 4 :(得分:0)
子查询语法似乎对我没有任何意义。您创建了一个查询计算MBDDX_TREATMENT_GROUP的所有行的查询,独立于STUDY_ID,然后尝试将其连接到表中,其连接条件不引用子查询结果中的任何内容(并且不能,没有别名)。
为什么不使用简单的连接?假设MBDDX_EXPERIMENT
还有一个主键ID
,您可以使用COUNT-DISTINCT执行此操作:
SELECT
MBDDX_STUDY.ID, MBDDX_STUDY.STUDY_NAME,
COUNT(DISTINCT MBDDX_EXPERIMENT.ID) AS NUMBER_OF_EXPERIMENTS
COUNT(DISTINCT MBDDX_TREATMENT_GROUP.GROUP_NO) AS NUMBER_OF_GROUPS
FROM
MBDDX_STUDY
INNER JOIN MBDDX_EXPERIMENT ON MBDDX_EXPERIMENT.STUDY_ID=MBDDX_STUDY.ID
INNER JOIN MBDDX_TREATMENT_GROUP ON MBDDX_TREATMENT_GROUP.STUDY_ID=MBDDX_STUDY.ID
GROUP BY
MBDDX_STUDY.ID, MBDDX_STUDY.STUDY_NAME
(MBDDX_STUDY.STUDY_NAME在技术上不应该根据ANSI SQL包含在GROUP BY表达式中,因为它对STUDY_ID具有功能依赖性。但是在Oracle上是必要的,它无法发现依赖关系。)< / p>
答案 5 :(得分:0)
对于你真正想做的事,你需要OUTER JOIN
s。
WITH number_of_experiments
AS ( SELECT study_id
, count ( * ) CNT
FROM MBDDX_EXPERIMENT
group by study_id )
, number_of_groups
as ( select study_id
, count ( * ) CNT
FROM mbddx_treatment_group
group by study_id )
select study_name
, coalesce(noex.cnt,0)
, coalesce(notr.cnt,0)
from mbddx_study
outer join number_of_experiments
as noex
using ( study_id )
outer join number_of_groups
as nogr
using ( study_id )