كيفية استخدام عمود مستعارة في الخلية جملة WHERE؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

وعندي استفسار الخلية مثل هذا:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;

وأريد أن تقييد النتائج إلى الصفوف حيث الحوادث> 0. هذا يبدو بسيطا جدا بالنسبة لي، لكنني لا يمكن أن يبدو والعمل على انجاحه. بغض النظر عن ما أحاول، وهرس أو HAVINGs، كلما أحاول أن إضافة هذا القيد أحصل NO ROWS في المقابل. أنا واثق أن هناك بيانات في مائدتي التي ينبغي أن تعاد. لا أحد يعرف كيفية تحقيق ما أفعله؟


ولقد حاولت ذلك، لكنه لا يزال لا يعمل. أي أفكار لماذا لا يزال لن تعمل؟

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" HAVING SUM(...some SQL removed for brevety)>0 GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
هل كانت مفيدة؟

المحلول

وأنا لست على دراية كما هو الحال مع الخلية وأنا مع SQL Server ولكن في T-SQL، لا يمكنك استخدام الأسماء المستعارة في GROUP BY البندين (اعتقدت في البداية ORDER BY بنود كذلك، ولكن هذا ومنذ ذلك الحين ثبت ل تكون غير صحيحة). في هذه الحالة، كنت تريد تصفية استنادا إلى نتائج GROUP BY، لذلك أود أن استخدام جملة HAVING كما يلي:

SELECT *, SUM(... some SQL removed for brevity ...) AS Occurrences
FROM
    some_table AS q
WHERE
    criterion = 'value'
GROUP BY
    q.P_id
HAVING
    SUM(... some SQL removed for brevity ...) > 0
ORDER BY
    Occurrences DESC
LIMIT 10;

نصائح أخرى

ويعمل هذا الاستعلام بالنسبة لي ...

select order_id, sum(qty_ordered) as total_qty 
from sales_flat_order_item 
group by order_id 
having total_qty > 10
order by total_qty desc

وآه، لقد وجدت المكان لذلك.

والبيان هو الآن:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id HAVING SUM(...some SQL removed for brevety)>0 ORDER BY Occurrences DESC LIMIT 10;

ويبدو أن تعمل بشكل جيد مع ORDER BY الحوادث،

وأعتقد يجب أن يكون الركام في بند HAVING. رغم ذلك، باعتراف الجميع، وأنا لست متأكدا مما اذا كان تقبل الأسماء المستعارة.

HAVING (Occurrences > 0)

HAVING (SUM(...some SQL removed for brevety) > 0)

وبدلا من ذلك، يمكنك استخدام استعلام فرعي:

SELECT *
FROM (
   -- your current query
) AS sub
WHERE (Occurences > 0)

وفقا لمعيار SQL، الأسماء المستعارة العمود غير متوفرة في الجسم الاستعلام، والتي هي مصدر ازعاج في قمة الحيرة. وبالنظر إلى ما كنت قد حاولت، وهذا يبدو كما لو أن نفس الشيء ينطبق على الخلية (وبعض نظم إدارة قواعد البيانات الأخرى). ربما عليك أن أكرر التعبير في جملة ORDER BY.

وأيضا، يجب أن جملة GROUP BY قائمة كل عمود ما في *، وليس فقط المفتاح الأساسي (على الرغم من، منطقيا، مع تحديد المفتاح الأساسي ينبغي أن يكون كافيا).

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