có một tùy chọn: with
cú pháp. Để sử dụng ví dụ OP, hình thức này sẽ trông giống như:
with data as (
select 'value1' name from dual
union all
select 'value2' name from dual
union all
...
select 'value10000+' name from dual)
select field1, field2, field3
from table1 t1
inner join data on t1.name = data.name;
Tôi gặp sự cố này. Trong trường hợp của tôi, tôi đã có một danh sách dữ liệu trong Java, mỗi mục có một item_id và một customer_id. Tôi có hai bảng trong DB với các mục đăng ký cho các mục khách hàng tương ứng. Tôi muốn nhận danh sách tất cả đăng ký cho các mục hoặc cho khách hàng cho mục đó, cùng với id mục.
tôi đã cố gắng ba biến thể:
- Nhiều lựa chọn từ Java (sử dụng các bộ để có được xung quanh giới hạn)
- Với cú pháp
- tạm thời bảng
Lựa chọn 1: Nhiều Các lựa chọn từ Java
Về cơ bản, tôi f IRST
select item_id, token
from item_subs
where (item_id, 0) in ((:item_id_0, 0)...(:item_id_n, 0))
Sau đó
select cus_id, token
from cus_subs
where (cus_id, 0) in ((:cus_id_0, 0)...(:cus_id_n, 0))
Sau đó, tôi xây dựng một bản đồ trong Java với cus_id là chìa khóa và một danh sách các mục như giá trị, và đối với mỗi thuê bao khách hàng tìm thấy tôi thêm (vào danh sách quay trở lại từ lựa chọn đầu tiên) mục nhập cho tất cả các mục có liên quan với item_id đó.Đó là nhiều mã Messier
Lựa chọn 2: Với cú pháp
Nhận tất cả mọi thứ cùng một lúc với một SQL như
with data as (
select :item_id_0 item_id, :cus_id_0 cus_id
union all
...
select :item_id_n item_id, :cus_id_n cus_id)
select I.item_id item_id, I.token token
from item_subs I
inner join data D on I.item_id = D.item_id
union all
select D.item_id item_id, C.token token
from cus_subs C
inner join data D on C.cus_id = D.cus_id
Lựa chọn 3: Tạm bảng
Tạo một tạm thời toàn cầu bảng với ba trường: rownr (khóa chính), item_id và cus_id. Chèn tất cả các dữ liệu có sau đó chạy một lựa chọn rất giống với phương án 2, nhưng liên kết trong bảng tạm thời thay vì Performance with data
Đây là không một phân tích hiệu suất hoàn toàn khoa học.
- Tôi đang chạy với cơ sở dữ liệu phát triển, với hơn 1000 hàng trong tập dữ liệu mà tôi muốn tìm đăng ký.
- Tôi vừa thử một tập hợp dữ liệu.
- Tôi không ở cùng vị trí thực tế với máy chủ DB của mình. Nó không xa lắm, nhưng tôi nhận thấy nếu tôi cố gắng từ nhà qua VPN thì tất cả sẽ chậm hơn nhiều, mặc dù nó là cùng một khoảng cách (và nó không phải là internet nhà của tôi đó là vấn đề).
- Tôi đã thử nghiệm cuộc gọi đầy đủ, vì vậy API của tôi gọi một cuộc gọi khác (cũng chạy trong cùng một trường hợp trong dev) cũng kết nối với DB để lấy tập dữ liệu ban đầu. Nhưng đó là như nhau trong cả ba trường hợp.
YMMV.
Điều đó nói rằng, tùy chọn bảng tạm thời là nhiều hơn chậm hơn. Như trong gấp đôi rất chậm. Tôi đã nhận được 14-15 giây cho tùy chọn 1, 15-16 cho tùy chọn 2 và 30 cho tùy chọn 3.
Tôi sẽ thử lại từ cùng một mạng với máy chủ DB và kiểm tra xem điều đó có thay đổi mọi thứ khi tôi nhận được cơ hội.
đặt giá trị1 .... giá trị1000 + vào bảng và chọn tên trong (chọn giá trị từ bảng) – basdwarf
Lỗi không phụ thuộc vào môi trường (ví dụ: SQL * Plus hoặc TOAD hoặc ...) nơi bạn thực hiện truy vấn của mình. –