Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Kasus penggunaan data bersarang
Topik ini menjelaskan kasus penggunaan untuk data bersarang. Data bersarang adalah data yang berisi bidang bersarang. Bidang bersarang adalah bidang yang disatukan sebagai entitas tunggal, seperti array, struct, atau objek.
Anda dapat menggabungkan ekstensi yang dijelaskan sebelumnya dengan SQL fitur biasa. Kasus penggunaan berikut menggambarkan beberapa kombinasi umum. Contoh-contoh ini membantu mendemonstrasikan bagaimana Anda dapat menggunakan data bersarang. Mereka bukan bagian dari tutorial.
Topik
Menelan data bersarang
Anda dapat menggunakan CREATE TABLE AS
pernyataan untuk menyerap data dari tabel eksternal yang berisi tipe data yang kompleks. Kueri berikut mengekstrak semua pelanggan dan nomor telepon mereka dari tabel eksternal, menggunakanLEFT
JOIN
, dan menyimpannya di tabel Amazon Redshift. CustomerPhones
CREATE TABLE CustomerPhones AS
SELECT c.name.given, c.name.family, p AS phone
FROM spectrum.customers c LEFT JOIN c.phones p ON true;
Menggabungkan data bersarang dengan subkueri
Anda dapat menggunakan subquery untuk mengumpulkan data bersarang. Contoh berikut menggambarkan pendekatan ini.
SELECT c.name.given, c.name.family, (SELECT COUNT(*) FROM c.orders o) AS ordercount
FROM spectrum.customers c;
Data berikut dikembalikan.
given | family | ordercount
--------|----------|--------------
Jenny | Doe | 0
John | Smith | 2
Andy | Jones | 1
(3 rows)
catatan
Saat Anda menggabungkan data bersarang dengan mengelompokkan berdasarkan baris induk, cara yang paling efisien adalah yang ditunjukkan pada contoh sebelumnya. Dalam contoh itu, baris bersarang c.orders
dikelompokkan berdasarkan baris induknya. c
Atau, jika Anda tahu bahwa id
unik untuk masing-masing customer
dan o.shipdate
tidak pernah nol, Anda dapat menggabungkan seperti yang ditunjukkan pada contoh berikut. Namun, pendekatan ini umumnya tidak seefisien contoh sebelumnya.
SELECT c.name.given, c.name.family, COUNT(o.shipdate) AS ordercount
FROM spectrum.customers c LEFT JOIN c.orders o ON true
GROUP BY c.id, c.name.given, c.name.family;
Anda juga dapat menulis kueri dengan menggunakan subquery dalam FROM
klausa yang mengacu pada alias (c
) dari kueri leluhur dan mengekstrak data array. Contoh berikut menunjukkan pendekatan ini.
SELECT c.name.given, c.name.family, s.count AS ordercount
FROM spectrum.customers c, (SELECT count(*) AS count FROM c.orders o) s;
Bergabung dengan Amazon Redshift dan data bersarang
Anda juga dapat menggabungkan data Amazon Redshift dengan data bersarang di tabel eksternal. Misalnya, misalkan Anda memiliki data bersarang berikut di Amazon S3.
CREATE EXTERNAL TABLE spectrum.customers2 (
id int,
name struct<given:varchar(20), family:varchar(20)>,
phones array<varchar(20)>,
orders array<struct<shipdate:timestamp, item:int>>
);
Misalkan juga Anda memiliki tabel berikut di Amazon Redshift.
CREATE TABLE prices (
id int,
price double precision
);
Kueri berikut menemukan jumlah total dan jumlah pembelian setiap pelanggan berdasarkan sebelumnya. Contoh berikut hanya ilustrasi. Ini hanya mengembalikan data jika Anda telah membuat tabel yang dijelaskan sebelumnya.
SELECT c.name.given, c.name.family, COUNT(o.date) AS ordercount, SUM(p.price) AS ordersum
FROM spectrum.customers2 c, c.orders o, prices p ON o.item = p.id
GROUP BY c.id, c.name.given, c.name.family;