المشاهدات MySQL: الرجوع إلى حقل محسوب واحد (بالاسم) في حقل محسوب آخر
-
19-09-2019 - |
سؤال
كيف يمكنني تحديد طريقة عرض تحتوي على اثنين من الحقول المحسوبة، على سبيل المثال ...
('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