【问题标题】:Oracle select with subquery带有子查询的 Oracle 选择
【发布时间】:2012-08-03 10:49:54
【问题描述】:

请您帮我处理下一个 oracle sql 查询。

SELECT "NEWS"."NEWSID" as ID,
       "NEWS"."SLUG",
       "NEWS_TRANSLATION".*, 
       (SELECT FILENAME FROM NEWS_MEDIA WHERE NEWSID = ID AND rownum <= 1 ORDER BY POSITION ASC) as FILENAME
FROM "NEWS" 
INNER JOIN "NEWS_TRANSLATION" ON NEWS.NEWSID = NEWS_TRANSLATION.NEWSID 
WHERE (NEWS.PUBLISH = 1) AND (NEWS_TRANSLATION.LANG = :lang) 
ORDER BY "NEWS"."NEWSID" DESC;

当我执行这个查询时出现错误

ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:
Error at Line: 4 Column: 74

【问题讨论】:

  • 如果打算从 news_media 获取新闻项目的 MIN 位置的文件名,我认为 rownum 使用不正确。选择一条记录后将应用“ORDER BY”。它需要被子查询,或者更好的是,与 MIN(position) 分开连接。见oracle.com/technetwork/issue-archive/2006/06-sep/…

标签: sql oracle subquery


【解决方案1】:

试试这个:

SELECT "NEWS"."NEWSID" as ID,
   "NEWS"."SLUG",
   "NEWS_TRANSLATION".*, 
   (SELECT * FROM (SELECT FILENAME FROM NEWS_MEDIA WHERE NEWSID = ID ORDER BY POSITION ASC) WHERE rownum = 1) as FILENAME
FROM "NEWS" 
INNER JOIN "NEWS_TRANSLATION" ON NEWS.NEWSID = NEWS_TRANSLATION.NEWSID 
WHERE (NEWS.PUBLISH = 1) AND (NEWS_TRANSLATION.LANG = :lang) 
ORDER BY "NEWS"."NEWSID" DESC;

你什么时候同时使用“order by”和“rownum”,你需要先对它们排序,然后寻找第一条记录。

【讨论】:

    【解决方案2】:

    这是工作代码

    SELECT "NEWS"."NEWSID" as ID,
       "NEWS"."SLUG",
       "NEWS_TRANSLATION".*, 
       (SELECT FILENAME FROM NEWS_MEDIA WHERE NEWSID = ID AND rownum <= 1 ) as FILENAME
    FROM "NEWS" 
    INNER JOIN "NEWS_TRANSLATION" ON NEWS.NEWSID = NEWS_TRANSLATION.NEWSID 
    WHERE (NEWS.PUBLISH = 1) AND (NEWS_TRANSLATION.LANG = :lang) 
    ORDER BY "NEWS"."NEWSID" DESC
    

    【讨论】:

    • 同一个Error at Line: 4 Column: 51
    • 我在子查询中将 ID 更改为 NEWS.NEWSID,一切正常。但是我如何使用 ORDER BY 来做到这一点?
    • 你想通过order by展示什么? ORDER BY POSITION ASC 是否像您的问题一样?
    • 每个文件都有位置,我想获取位置在前的文件。我可以写WHERE POSITION = 1之类的东西,但我不能确定该文件的位置为1,这就是我使用ORDER BY子句的原因
    【解决方案3】:

    请尝试删除子查询中的 order by 子句。

    【讨论】:

    • 从 NEWS_MEDIA 中选择文件名,其中 NEWSID = ID AND rownum
    【解决方案4】:

    试试这个:

    SELECT "NEWS"."NEWSID" AS ID, "NEWS"."SLUG", "NEWS_TRANSLATION".*,
           (SELECT FILENAME
              FROM NEWS_MEDIA
             WHERE NEWSID = "NEWS"."NEWSID" AND ROWNUM <= 1)
               AS FILENAME
      FROM     "NEWS"
           INNER JOIN
               "NEWS_TRANSLATION"
           ON NEWS.NEWSID = NEWS_TRANSLATION.NEWSID
     WHERE (NEWS.PUBLISH = 1) AND (NEWS_TRANSLATION.LANG = :LANG)
    ORDER BY "NEWS"."NEWSID" DESC
    

    【讨论】:

    • 当你的子查询只为主查询中的每条记录返回一个值时,你为什么要对子查询进行排序??
    • 我在这里回答你的问题stackoverflow.com/questions/11794242/…
    • @Pivasyk 我的问题是:子查询中排序的目的是什么?
    【解决方案5】:
    SELECT STUDENT_NAME, STUDENT_ALIAS_NAME
    FROM school
    WHERE STUDENT_NAME IN (
            SELECT STUDENT_NAME
            FROM school
            WHERE STUDENT_DEPARMENT= 0
            ); 
    

    【讨论】:

    • 虽然这可能会回答问题,但请备份您的代码并解释为什么它会起作用以及为什么它比其他答案更好。
    猜你喜欢
    • 2021-03-26
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    相关资源
    最近更新 更多