【问题标题】:Oracle SQL: How return several distinct columnsOracle SQL:如何返回几个不同的列
【发布时间】:2019-09-24 08:43:48
【问题描述】:

我有一个输出的 Oracle 查询

但我希望输出除事件 ID 之外的所有不同列,即

我尝试将 GROUP BY 添加到 Oracle Query 但出现错误,

DataSource.Error: Oracle: ORA-00979: not a GROUP BY expression
Details:
    DataSourceKind=Oracle
    DataSourcePath=dlporacle
    Message=ORA-00979: not a GROUP BY expression
    ErrorCode=-2147467259

以下是我的查询...请协助

SELECT 
   I.INCIDENTID                    AS "Incident ID",
   I.CREATIONDATE                  AS "Creation Date",
   MO.IPADDRESS           AS "IP Address",
   MO.DOMAINUSERNAME               AS "Login ID",
   MO.ENDPOINTMACHINENAME          AS "Computer Name",
   M.MESSAGESUBJECT                AS "Email Subject"
 FROM MESSAGE M,
 JOIN INCIDENT I ON M.MESSAGEID = I.MESSAGEID AND M.MESSAGESOURCE = I.MESSAGESOURCE AND  M.MESSAGEDATE  = I.MESSAGEDATE
 JOIN MESSAGEORIGINATOR MO ON  M.MESSAGEORIGINATORID = MO.MESSAGEORIGINATORID
 WHERE  M.MESSAGESOURCE = 'ENDPOINT'
    AND I.ISDELETED = 0
  GROUP BY MO.IPADDRESS, MO.DOMAINUSERNAME, MO.ENDPOINTMACHINENAME, M.MESSAGESUBJECT

【问题讨论】:

    标签: sql oracle group-by


    【解决方案1】:

    修复JOIN 语法并使用聚合:

    SELECT
       MIN(I.INCIDENTID)      AS "Incident ID",
       I.CREATIONDATE                  AS "Creation Date",
       MO.IPADDRESS           AS "IP Address",
       MO.DOMAINUSERNAME               AS "Login ID",
       MO.ENDPOINTMACHINENAME          AS "Computer Name",
       M.MESSAGESUBJECT                AS "Email Subject"
    FROM MESSAGE M JOIN
         INCIDENT I
         ON M.MESSAGEID = I.MESSAGEID AND
            M.MESSAGESOURCE = I.MESSAGESOURCE AND
            M.MESSAGEDATE = I.MESSAGEDATE JOIN
         MESSAGEORIGINATOR MO
         ON  M.MESSAGEORIGINATORID = MO.MESSAGEORIGINATORID
    WHERE M.MESSAGESOURCE = 'ENDPOINT' AND I.ISDELETED = 0
    GROUP BY I.CREATIONDATE, MO.IPADDRESS, MO.DOMAINUSERNAME, MO.ENDPOINTMACHINENAME, M.MESSAGESUBJECT
    

    所有未聚合的列需要在GROUP BY中。

    为什么来源和日期必须与INCIDENT 的连接以及消息ID 匹配?看来message id应该够用了。

    【讨论】:

    • 你的也可以。来源和日期必须根据内部数据进行匹配。
    【解决方案2】:

    试试这个

     SELECT MIN(I.INCIDENTID)               AS "Incident ID",
            I.CREATIONDATE                  AS "Creation Date",
            MO.IPADDRESS                    AS "IP Address",
            MO.DOMAINUSERNAME               AS "Login ID",
            MO.ENDPOINTMACHINENAME          AS "Computer Name",
            M.MESSAGESUBJECT                AS "Email Subject"
       FROM MESSAGE M,
            INCIDENT I,
            MESSAGEORIGINATOR MO
      WHERE M.MESSAGESOURCE = 'ENDPOINT'
        AND M.MESSAGESOURCE = I.MESSAGESOURCE
        AND M.MESSAGEID = I.MESSAGEID
        AND M.MESSAGEDATE = I.MESSAGEDATE 
        AND M.MESSAGEORIGINATORID = MO.MESSAGEORIGINATORID 
        AND I.ISDELETED = 0
      GROUP BY I.CREATIONDATE, MO.IPADDRESS, MO.DOMAINUSERNAME, MO.ENDPOINTMACHINENAME,M.MESSAGESUBJECT
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2021-12-24
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多