لا يرى شركة Sacquery Oracle المتغير من المستويات الخارجية 2
سؤال
أود الحصول على استعلام واحد وظيفة التعليق الأول المرتبط بهذه المشاركة. إليك كيف أفعل ذلك في 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
ويعمل بشكل جيد.
ومع ذلك، في Oracle أحصل على خطأ ORA-00904 p.post_id: معرف غير صالح.
يبدو أنه يعمل بشكل جيد لمدة تتشدد واحد، لكنني لا أستطيع الحصول على تعليق واحد فقط بسبب حقيقة أنني بحاجة إلى استخدام Rownum (بدون حد / إزاحة في Oracle).
ماذا أفعل الخطأ هنا؟
المحلول
لا، Oracle
لا يرتبط الطرد التلقائي متداخلا أكثر من مستوى عميق (ولا يفعل MySQL
).
هذه مشكلة معروفة.
استخدم هذا:
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
نصائح أخرى
إذا كنت بحاجة إلى SQL وهي منصة مستقلة، فسوف تعمل هذا:
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
);
لكنه يفترض أن (post_id، create_date) هو المفتاح الأساسي للتعليقات. إذا لم يكن الأمر كذلك، فستحصل على أكثر من منشورات سيسة واحدة لديها تعليقات مع نفس create_date.
أيضا، من المحتمل أن تكون أبطأ من الحل الذي يستخدم التحليلات، التي قدمتها Quassnoi.