tipos - pl sql ejemplos
La subconsulta de Oracle no ve la variable desde el bloque externo 2 niveles hacia arriba (2)
Me gustaría obtener en una consulta una publicación y el primer comentario asociado con la publicación. Así es como lo hago en PostgreSQL:
SELECT p.post_id,
(select * from
(select comment_body from comments where post_id = p.post_id
order by created_date asc) where rownum=1
) the_first_comment
FROM posts p
y funciona bien.
Sin embargo, en Oracle me aparece un error ORA-00904 p.post_id: identificador no válido.
Parece que funciona bien para una subselección, pero no puedo obtener el comentario con solo una debido al hecho de que necesito usar rownum (sin límite / compensación en Oracle).
¿Qué estoy haciendo mal aquí?
No, Oracle
no correlaciona las subconsultas anidadas en más de un nivel de profundidad (y tampoco lo hace MySQL
).
Este es un problema bien conocido.
Utilizar esta:
SELECT p.post_id, c.*
FROM posts
JOIN (
SELECT c.*, ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY created_date ASC) AS rn
FROM comments c
) c
ON c.post_id = p.post_id
AND rn = 1
Si necesita SQL que sea independiente de la plataforma, esto funcionará:
SELECT p.post_id
, c.comment_body
FROM posts p
, comments c
WHERE p.post_id = c.post_id
AND c.created_date IN
( SELECT MIN(c2.created_date)
FROM comments c2
WHERE c2.post_id = p.post_id
);
Pero asume que (post_id, created_date) es la clave principal de los comentarios. Si no lo es, obtendrás más de una línea de publicaciones que tienen comentarios con la misma fecha de creación.
Además, es probable que sea más lenta que la solución que utiliza análisis, dada por Quassnoi.