Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL,oracle中的内部连接问题_Sql_Oracle - Fatal编程技术网

SQL,oracle中的内部连接问题

SQL,oracle中的内部连接问题,sql,oracle,Sql,Oracle,^医院专科检查^ ^医院^ 这是我的两张桌子。我正在尝试使用内部联接生成结果,这是我当前使用的查询: SELECT HOSPITAL_ID, COUNT(DISTINCT SPECIALISE) AS SPECIALISE FROM HOSPITAL_SPECIALISE_TEST GROUP BY HOSPITAL_ID; 我得到下面的结果 现在的问题是,我想连接两个表并显示医院名称,但它无法生成,我不知道为什么。。。 我的问题是: SELECT HS.HOSPITAL_ID, HP.N

^医院专科检查^

^医院^

这是我的两张桌子。我正在尝试使用内部联接生成结果,这是我当前使用的查询:

SELECT HOSPITAL_ID, COUNT(DISTINCT SPECIALISE) AS SPECIALISE FROM HOSPITAL_SPECIALISE_TEST GROUP BY HOSPITAL_ID;
我得到下面的结果

现在的问题是,我想连接两个表并显示医院名称,但它无法生成,我不知道为什么。。。 我的问题是:

SELECT HS.HOSPITAL_ID, HP.NAME, COUNT(DISTINCT HS.SPECIALISE) AS SPECIALISE 
FROM HOSPITAL_SPECIALISE_TEST HS
INNER JOIN HOSPITAL HP 
on HS.HOSPITAL_ID = HP.HOSPITAL_ID 
GROUP BY HOSPITAL_ID;
改为这样做

SELECT HP.NAME, spec.hospital_id, spec.specialise
FROM (  SELECT HOSPITAL_ID, COUNT (DISTINCT SPECIALISE) AS SPECIALISE
        FROM HOSPITAL_SPECIALISE_TEST
    GROUP BY HOSPITAL_ID) spec
   INNER JOIN HOSPITAL HP ON spec.HOSPITAL_ID = HP.HOSPITAL_ID
改为这样做

SELECT HP.NAME, spec.hospital_id, spec.specialise
FROM (  SELECT HOSPITAL_ID, COUNT (DISTINCT SPECIALISE) AS SPECIALISE
        FROM HOSPITAL_SPECIALISE_TEST
    GROUP BY HOSPITAL_ID) spec
   INNER JOIN HOSPITAL HP ON spec.HOSPITAL_ID = HP.HOSPITAL_ID

分组依据必须包含所有选择列(聚合除外):


分组依据HS.HOSPITAL\u ID,HP.NAME.

分组依据必须包含所有选择列(聚合除外):


分组依据HS.HOSPITAL\u ID,HP.NAME。

虽然医院名称可以从您分组依据的医院ID中明确得出,但Oracle要求它也包括在GROUP BY子句中,或者进行聚合。这导致了一个相当笨拙的查询:

select hs.hospital_id, hp.name, count(distinct hs.specialise) as specialise 
from hospital_specialise_test hs
inner join hospital hp on hs.hospital_id = hp.hospital_id 
group by hs.hospital_id, hp.name;

这符合旧的SQL 92标准,但不符合SQL标准的较新版本,后者很乐意接受您的查询:-)

您可以通过不加入表来避免此问题:

select 
  hs.hospital_id, 
  (select name from hospital hp where hs.hospital_id = hp.hospital_id) as name,
  count(distinct hs.specialise) as specialise 
from hospital_specialise_test hs
group by hospital_id, hp.name;

或者按照cableload的建议,加入预聚合记录。

尽管医院名称可以从您分组依据的医院ID中明确得出,但Oracle要求将其也包括在GROUP by子句中,或者进行聚合。这导致了一个相当笨拙的查询:

select hs.hospital_id, hp.name, count(distinct hs.specialise) as specialise 
from hospital_specialise_test hs
inner join hospital hp on hs.hospital_id = hp.hospital_id 
group by hs.hospital_id, hp.name;

这符合旧的SQL 92标准,但不符合SQL标准的较新版本,后者很乐意接受您的查询:-)

您可以通过不加入表来避免此问题:

select 
  hs.hospital_id, 
  (select name from hospital hp where hs.hospital_id = hp.hospital_id) as name,
  count(distinct hs.specialise) as specialise 
from hospital_specialise_test hs
group by hospital_id, hp.name;
或者,按照cableload的建议,加入预聚合记录。

“但它无法生成”是对正在发生的事情的一种弱描述。您应该告诉我们Oracle错误(“ORA-00979不是表达式分组”)。“但它无法生成”是对正在发生的事情的一个弱描述。您应该告诉我们Oracle错误(“ORA-00979不是GROUP BY表达式”)。