繁体   English   中英

带分组的SQL子查询

[英]SQL sub query with group by

我有以下SQL查询:

SELECT 
kvknum.cd_hfdrelnr, 
kvknum.cd_kvkanum,
    relName.cd_hfdrelnr
FROM
(
    SELECT 
        cd_hfdrelnr, 
        cd_kvkanum

FROM er_105
WHERE cd_kvkanum IN
(
    SELECT cd_kvkanum
    FROM er_105
    GROUP BY cd_kvkanum
    HAVING COUNT(*) > 1 
)
AND cd_kvkanum != ''
ORDER BY cd_kvkanum
) AS kvknum
LEFT OUTER JOIN
(
    SELECT 
        cd_hfdrelnr,
        cd_relnaam
    FROM er_101
) AS relName
ON kvknum.cd_hfdrelnr = relName.cd_hfdrelnr

不允许使用GROUP BY功能,因此需要将相同的cd_kvkanum值一起显示在彼此之下,是否可以解决此问题或如何实现?

以下错误随之而来:

“消息1033,级别15,状态1,行21除非还指定了TOP或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效。消息156,级别15,状态1,第28行关键字'AS'附近的语法不正确。“

当我运行以下查询时:

SELECT 
    cd_hfdrelnr, 
    cd_kvkanum

FROM er_105
WHERE cd_kvkanum IN
(
    SELECT cd_kvkanum
    FROM er_105
    GROUP BY cd_kvkanum
    HAVING COUNT(*) > 1 
)
AND cd_kvkanum != ''
ORDER BY cd_kvkanum

(连接的第一个子查询)结果如下:
1235 - 123
4652 - 123
8569 - 1234
4985 - 1234

虽然我想将cd_relnaam添加到结果列表,但是当在查询中使用JOIN时我的结果是空白的...

谁知道我做错了什么?

这不是一个完整的答案,但是,如果我没有弄错的话,你的查询可以写得更简单。 当人们在编写简单的查询时编写非常复杂的查询,就会出现90%的错误。 简单是成功的关键:)当你提出更确切的问题时,我会编辑答案

SELECT 
    kvknum.cd_hfdrelnr, 
    kvknum.cd_kvkanum,
    relName.cd_hfdrelnr
FROM er_105 as kvknum
    LEFT OUTER JOIN er_101 as relName on relName.cd_hfdrelnr = kvknum.cd_hfdrelnr
where
    kvknum.cd_kvkanum IN
    (
        SELECT cd_kvkanum
        FROM er_105
        GROUP BY cd_kvkanum
        HAVING COUNT(*) > 1 
    ) AND
    cd_kvkanum != ''

这里的问题不在于GROUP BY,它实际上是使用ORDER BY,你不能把它放在子查询中,它必须在你的父查询上。 另外我的理解是你想要来自er_105的记录,其中cd_kvkanum不止一次出现而且不是空白,但你不想聚合。

SELECT er_105.cd_hfdrelnr, 
       er_105.cd_kvkanum,
       er_101.cd_relnaam
  FROM er_105
  JOIN (SELECT cd_kvkanum,COUNT(cd_kvkanum)
          FROM er_105
         WHERE cd_kvkanum != ''
      GROUP BY cd_kvkanum
        HAVING COUNT(cd_kvkanum) > 1
       ) kvknum ON er_105.cd_kvkanum = kvknum.cd_kvkanum
LEFT JOIN er_101 ON er_105.cd_hfdrelnr = er_101.cd_hfdrelnr
 ORDER BY er_105.cd_kvkanum

通常情况下,当您想要计算某事物的出现时,做SELECT事物,COUNT(PrimaryKey)而不是COUNT(*)会更好。 *使SQL做出额外的步骤,找出*代表什么。 当然,就像stackoverflow上的许多查询一样,总是有一种更简单的方法来编写它;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM