选择distinct,但使用ORACLE返回其他列

时间:2015-02-18 15:20:41

标签: sql oracle

我正在尝试在'url'字段上执行select distinct,同时拉入其他几个字段的数据。我尝试了下面但它给了我一些错误消息'缺少表达'。我正在使用ORACLE。任何人都可以帮助我

SELECT distinct on url,
                is_aw_grp_id,
                is_aw_page_id,
                eppcm_contentid
  FROM ps_z_google_srch
 WHERE     url <> ' '
       AND EPPCM_CONT_TYPE = 'H'
       AND TO_CHAR (dttm_imported, 'dd-MON-yyyy HH:MM:SS') >=
              (SELECT TO_CHAR (LASTCHANGEDTTM, 'dd-MON-yyyy HH:MM:SS')
                 FROM PS_Z_CONT_LAST_CHG
                WHERE RECNAME = 'Z_GOOGLE_SRCH')

1 个答案:

答案 0 :(得分:5)

&#39; on&#39;是一个关键字,导致抛出此错误;它使解析器感到困惑。它不是distinct in Oracle所需要的或有效的(因为我相信它适用于PostgreSQL,所以也许是其他数据库),所以删除这个词:

SELECT distinct url,
                is_aw_grp_id,
                is_aw_page_id,
                eppcm_contentid
...

这将获得这四个字段的所有不同的组合。假设您的网址显示在多行中,如果您只想显示每个网址,那么您需要确定其他三个字段所需的值 - 来自该网址的所有行 - 这可以通过聚合完成或分析函数或子查询,具体取决于数据和要求。


偏离主题,但这看起来很奇怪:

TO_CHAR (dttm_imported, 'dd-MON-yyyy HH:MM:SS') >=
              (SELECT TO_CHAR (LASTCHANGEDTTM, 'dd-MON-yyyy HH:MM:SS')
...

您将两个日期转换为字符串,然后将它们与字符串语义进行比较;所以&#39; 01-MAR-2015&#39;将在#28; 28-FEB-2015&#39;之前进行排序,因为1在字符集中位于2之前。如果你要比较字符串,它们应该是比较有意义的形式,比如ISO格式。但是将它们转换成字符串无论如何都没有意义,只需将它们作为日期进行比较:

dttm_imported >= (SELECT LASTCHANGEDTTM
...

您也可以加入两个表而不是使用子查询。