Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengagregatkan Lajur Tunggal dengan Cekap dalam Pertanyaan SQL Berbilang Lajur?
Agregat Lajur Tunggal dalam Pertanyaan dengan Jadual Berbilang Lajur
Dalam situasi di mana anda mempunyai pertanyaan dengan berbilang lajur dan keinginan untuk mengagregat satu lajur tertentu, ia boleh memberikan cabaran. Pertimbangkan pertanyaan berikut:
SELECT t1.foo1, t1.foo2, t2.foo3, t2.foo4, string_agg(t3.aggregated_field, ', ') FROM tbl1 t1 LEFT JOIN tbl2 t2 ON t1.id = t2.fkeyid LEFT JOIN tbl3 t3 ON t2.id = t3.fkeyid GROUP BY t1.foo1, t1.foo2, t2.foo3, t2.foo4, t2.foo5, t2.foo6 ORDER BY t2.foo5, t2.foo6
Semasa pertanyaan berfungsi, ia menjadi bertele-tele kerana keperluan untuk menyenaraikan semua medan bukan agregat dalam kedua-dua klausa GROUP BY dan ORDER BY. Kekangan ini timbul kerana agregat tidak dibenarkan dalam klausa ini.
Nasib baik, untuk PostgreSQL 9.1 dan kemudian, penyelesaian yang lebih mudah wujud. Dengan memanfaatkan konsep pengumpulan mengikut kunci utama, pertanyaan boleh dipermudahkan secara dramatik:
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ') FROM tbl1 GROUP BY 1 ORDER BY foo7, foo8; -- had to spell out, since no longer in select list!
Walau bagaimanapun, jika pertanyaan itu melibatkan berbilang jadual dengan perhubungan yang kompleks, mungkin lebih cekap untuk menggunakan pendekatan alternatif. Dengan melakukan pengagregatan dahulu dan kemudian menyertai keputusan, bahagian pertanyaan yang tidak diagregatkan boleh dioptimumkan:
SELECT t1.foo1, t1.foo2, ... , t2.bar1, t2.bar2, ... , a.aggregated_col FROM tbl1 t1 LEFT JOIN tbl2 t2 ON ... ... LEFT JOIN ( SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col FROM agg_tbl a ON ... GROUP BY some_id ) a ON a.some_id = ?.some_id ORDER BY ...
Dalam senario ini, majoriti pertanyaan boleh diteruskan tanpa pengagregatan, yang membawa kepada prestasi yang lebih baik.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengagregatkan Lajur Tunggal dengan Cekap dalam Pertanyaan SQL Berbilang Lajur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!