المشاهدات MySQL: الرجوع إلى حقل محسوب واحد (بالاسم) في حقل محسوب آخر

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

سؤال

كيف يمكنني تحديد طريقة عرض تحتوي على اثنين من الحقول المحسوبة، على سبيل المثال ...

 ('TableName'.'BlueSquares' + 'TableName'.'RedSquares') AS TotalSquares, ('TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalCircles

... وإنشاء حقل ثالث محسوب يعتمد على أول حقول محسوبة، كما هو الحال في ...

 ('ViewName'.'TotalSquares' + 'ViewName'.'TotalCircles') AS TotalShapes

...?

عندما أشير إلى أول حقولتين محسوبتين بالاسم، أحصل على رسالة مفادها أن الحقول غير معروفة.

شكرا!

هل كانت مفيدة؟

المحلول

نظرا لعدم السماح للنظرية في الآراء، فستحتاج إلى محاكاةها عن طريق إنشاء طرق عرض متعددة.

على سبيل المثال، سيحل هذا الاستعلام مشكلتك إذا تم تنفيذها مباشرة:

SELECT 
    TotalCircles + TotalSquares AS TotalShapes
FROM
    (SELECT 
        BlueCirles + RedCircles AS TotalCircles,
        BlueSquares + RedSquares AS TotalSquares
    FROM
        (SELECT
            2 AS BlueCirles,
            3 AS RedCircles,
            4 AS BlueSquares,
            5 AS RedSquares
        ) AS shapes
    ) as totals;

بحسب ال وثائق mysql وجهات النظر لها تقييد عدم القدرة على احتواء النوايتين في البند من. للتغلب على هذا القيد وتحويل هذا الاستعلام إلى طريقة عرض، اقتحمها إلى 3 طرق عرض (واحد لكل فرعك استقبال) مع آخر إعطاء المزيج المرغوب من الحقول:

CREATE VIEW shapes AS
SELECT
    2 AS BlueCirles,
    3 AS RedCircles,
    4 AS BlueSquares,
    5 AS RedSquares;

CREATE VIEW totals AS
SELECT 
    BlueCirles + RedCircles AS TotalCircles,
    BlueSquares + RedSquares AS TotalSquares
FROM
    shapes;

CREATE VIEW result AS
SELECT 
    TotalCircles + TotalSquares AS TotalShapes
FROM
    totals;

SELECT * FROM result;

نصائح أخرى

... إنشاء حقل محسوب ثالث يستند إلى أول حقولتين محسوبتين ...

كما وجدت، لا يمكنك الرجوع إلى الأعمدة المحسوبة في نفس الاختيار. خياراتك هي:

تكرار المنطق

لا يدعم MySQL من النزيلين في وجهات النظر لسبب غريب:

CREATE OR REPLACE VIEW your_view AS
SELECT t.BlueSquares + t.RedSquares AS TotalSquares, 
       t.BlueCirles + t.RedCircles AS TotalCircles,
       t.BlueSquares + t.RedSquares + t.BlueCirles + t.RedCircles AS TotalShapes
  FROM TABLE t

طبقة وجهات النظر

الخيار الأقل موصى به ...

 CREATE OR REPLACE VIEW initial_view AS
    SELECT t.BlueSquares + t.RedSquares AS TotalSquares, 
           t.BlueCirles + t.RedCircles AS TotalCircles,
      FROM TABLE

 CREATE OR REPLACE VIEW layered_view AS
    SELECT iv.TotalSquares + iv.TotalCircles AS TotalShapes
      FROM initial_view iv

لسوء الحظ، ما تحاول القيام به ليس ممكنا في الواقع الطريقة التي تقوم بها. بشكل عام، يمكن عرض وجهات النظر MySQL كحديد خطي. لا يتم تخزين نتائج العرض في قاعدة البيانات منفصلة عن مصدرها، ولكنها محسوبة إلى حد ما عند الرجوع إلى العرض.

معظم الوقت، يستخدم MySQL خوارزمية الدمج عند تحديد من وجهة نظر. هذا يعني أنه يدمج تعريف وجهة نظرك والبيان المحدد الذي يشير إلى عرضه لإنشاء تحديد نهائي يعمل بالفعل. على هذا النحو، لا يمكنك حقا الرجوع إلى نفسه.

خياراتك هنا هي (1) حدد طريقة عرض ثانية تشير إلى الرأي الأول من أجل إنشاء المبلغ الخاص بك، أو (2) اكتب المجموع لفترة طويلة مثل هذا:

('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top