Bạn đang gọi unnest
3 lần vào FROM
, điều đó có nghĩa là bạn đang thực hiện CROSS JOIN
(sản phẩm của cartesian) của 3.
Nếu bạn đang sử dụng PostgreSQL 9.4 trở lên, bạn có thể đơn giản thực hiện một lệnh gọi unnest
đưa từng mảng làm đầu vào:
select * from
unnest(
array['2001622', '2001624', '2007903'],
array[15,14,8],
array['type1', 'type1', 'type1'],
array[false, true, true]
) as u(id, ver, type, enabled)
Một tùy chọn khác, đối với bất kỳ phiên bản nào, là thêm lệnh gọi vào unnest
trong SELECT
thay vì FROM
:
select
unnest(array['2001622', '2001624', '2007903']) as id,
unnest(array[15,14,8]) as ver,
unnest(array['type1', 'type1', 'type1']) as type,
unnest(array[false, true, true]) as enabled
Trong cả hai trường hợp, nhưng đặc biệt ở trường hợp cuối cùng, bạn phải đảm bảo mỗi mảng có cùng một số phần tử chính xác. Nếu nó không nằm trên phương thức đầu tiên, mỗi hàng bị thiếu sẽ được điền là NULL, nhưng ở phương thức thứ hai, nó sẽ trả về nhiều hàng bằng LCM số lượng hàng được trả về bởi mỗi hàng, điều mà bạn có thể không muốn. Ví dụ:
SELECT * FROM unnest(array[1,2,3,4], array['a','b','c','d','e','f']);
unnest | unnest
--------+--------
1 | a
2 | b
3 | c
4 | d
[null] | e
[null] | f
(6 rows)
SELECT unnest(array[1,2,3,4]), unnest(array['a','b','c','d','e','f']);
unnest | unnest
--------+--------
1 | a
2 | b
3 | c
4 | d
1 | e
2 | f
3 | a
4 | b
1 | c
2 | d
3 | e
4 | f
(12 rows)
Kiểm tra tài liệu về lệnh gọi hàm bảng để biết thêm thông tin.