2012-08-03 13 views
7

¿Podría ayudarme con la siguiente consulta sql de Oracle?Oracle select with subquery

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; 

Cuando ejecuto esta consulta que tienen errores

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

Si la intención es obtener el nombre de archivo de la posición MIN para una noticia de news_media, no creo que rownum se esté utilizando correctamente. El "ORDER BY" se aplica después de seleccionar un registro. Tendría que ser sub-consultado o, mejor aún, unido por separado con MIN (posición). Ver http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html – Glenn

Respuesta

9

Prueba esto:

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; 

Cuando se está utilizando "ordenar por" y " rownum "juntos, primero debe pedirlos y buscar el primer registro.

1

Por favor, intente mediante la eliminación de la cláusula ORDER BY en la sub-consulta.

+0

Probado, pero tengo el mismo error. – rtyshyk

+0

SELECCIONAR NOMBRE DE ARCHIVO DE NEWS_MEDIA DONDE NEWSID = ID Y rownum <= 1; No estoy seguro acerca de la identificación del nombre de la columna, por favor confirme también. – TechDo

1

Aquí está el funcionamiento código:

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 
+0

El mismo 'Error at Line: 4 Column: 51' – rtyshyk

+0

Cambié el ID a NEWS.NEWSID en la subconsulta y todo funciona bien. ¿Pero cómo puedo hacerlo con ORDER BY? – rtyshyk

+0

¿Qué quieres mostrar por 'orden de'? ¿Es la parte 'ORDER BY POSITION ASC' como en su pregunta? – Mistu4u

1

Prueba esto:

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 
+0

Cuando la subconsulta arroja un solo valor para cada registro en la consulta principal, entonces ¿por qué estás tratando de ordenar la subconsulta? – hmmftg

+0

Respondo su pregunta aquí http://stackoverflow.com/questions/11794242/oracle-select-with-subquery#comment15674817_11796362 – rtyshyk

+0

@Pivasyk Mi pregunta es: ¿Cuál es el propósito de clasificar en la subconsulta? – hmmftg

-2
SELECT STUDENT_NAME, STUDENT_ALIAS_NAME 
FROM school 
WHERE STUDENT_NAME IN (
     SELECT STUDENT_NAME 
     FROM school 
     WHERE STUDENT_DEPARMENT= 0 
     ); 
+0

Si bien esto puede responder a la pregunta, haga una copia de seguridad de su código con una explicación de por qué funcionará y por qué es mejor que las otras respuestas. –

Cuestiones relacionadas