Tampilan MySQL: Mereferensikan satu bidang kalkulasi (berdasarkan nama) di bidang kalkulasi lainnya

Bagaimana saya bisa mendefinisikan tampilan yang memiliki dua bidang terhitung, misalnya...

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

...dan buat kolom kalkulasi ketiga yang didasarkan pada dua kolom kalkulasi pertama, seperti pada...

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

...?

Saat saya mereferensikan dua kolom kalkulasi pertama berdasarkan nama, saya mendapat pesan bahwa kolom tersebut tidak diketahui.

Terima kasih!


person Alan M.    schedule 13.12.2009    source sumber


Jawaban (3)


Karena subkueri tidak diperbolehkan dalam tampilan, Anda perlu menyimulasikannya dengan membuat beberapa tampilan.

Misalnya, kueri ini akan menyelesaikan masalah Anda jika dijalankan langsung:

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;

Menurut dokumentasi MySQL tampilan memiliki batasan pada tidak dapat memuat subkueri dalam klausa FROM. Untuk mengatasi batasan ini dan mengubah kueri ini menjadi tampilan, bagi menjadi 3 tampilan (satu untuk setiap subkueri) dengan tampilan terakhir memberikan kombinasi bidang yang diinginkan:

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;
person Adam Franco    schedule 13.12.2009
comment
Jika Anda mencobanya, Anda akan melihatnya menyebabkan kesalahan SQL. Hal ini karena pernyataan SELECT tidak dapat memuat subquery dalam klausa FROM. Lihat: dev.mysql.com/doc/refman/5.0/ en/create-view.html - person Conspicuous Compiler; 13.12.2009
comment
Saya memperhatikan ini ketika saya menguji jawaban awal saya. Saya telah memperbaruinya untuk menggunakan beberapa tampilan untuk mensimulasikan subkueri. - person Adam Franco; 13.12.2009
comment
Terima kasih telah berupaya keras dalam hal ini. Saya menghargainya. - person Alan M.; 13.12.2009

...membuat kolom kalkulasi ketiga yang didasarkan pada dua kolom kalkulasi pertama...

Seperti yang Anda temukan, Anda tidak dapat mereferensikan kolom terhitung di SELECT yang sama. Pilihan Anda adalah:

Gandakan logikanya

MySQL tidak mendukung subkueri dalam tampilan karena beberapa alasan aneh:

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

Lapisi Tampilan

Opsi yang paling tidak direkomendasikan...

 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
person OMG Ponies    schedule 13.12.2009

Sayangnya, apa yang Anda coba lakukan sebenarnya tidak mungkin dilakukan dengan cara yang Anda lakukan. Umumnya, tampilan MySQL dapat dilihat sebagai skrip SELECT. Hasil tampilan tidak disimpan di database terpisah dari sumbernya, namun dihitung saat Anda merujuk ke tampilan tersebut.

Seringkali, MySQL menggunakan algoritma MERGE ketika Anda SELECT dari suatu tampilan. Ini berarti ia menggabungkan definisi tampilan Anda dan pernyataan SELECT yang mengacu pada tampilan tersebut untuk membuat SELECT akhir yang benar-benar dijalankan. Karena itu, Anda tidak dapat membuat VIEW merujuk pada dirinya sendiri.

Pilihan Anda di sini adalah (1) menentukan tampilan kedua yang mengacu pada tampilan pertama untuk membuat penjumlahan, atau (2) menuliskan penjumlahan secara tertulis seperti ini:

('TableName'.'BlueSquares' + 'TableName'.'RedSquares' + 'TableName'.'BlueCirles' + 'TableName'.'RedCircles') AS TotalShapes
person Conspicuous Compiler    schedule 13.12.2009