لا يرى شركة Sacquery Oracle المتغير من المستويات الخارجية 2

StackOverflow https://stackoverflow.com/questions/2048244

  •  20-09-2019
  •  | 
  •  

سؤال

أود الحصول على استعلام واحد وظيفة التعليق الأول المرتبط بهذه المشاركة. إليك كيف أفعل ذلك في 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top