Có bất kỳ câu lệnh vòng lặp nào trong SQLite như FOR .. in .. LOOP
hoặc một cái gì đó tương tự không? Tôi có hai cột StartRange, EndRange
và tôi cần chèn toàn bộ chuỗi trong bảng khác. Vì vậy, nếu StartRange
là 1 và EndRange
là 3 cần thiết để thực hiện ba lần chèn có giá trị, chứa 1, 2, 3
.Câu lệnh lặp SQLite?
Trả lời
Bạn có thể làm điều này trong SQL thẳng nếu bạn có thêm một bảng chứa tất cả các số nguyên mà bạn cần.
Giả sử bạn StartRange
và EndRange
phạm vi từ một đến mười và bạn có một bảng như thế này:
sqlite> select i from ints;
i
1
.
.
.
10
Bảng này chỉ đơn giản có chứa tất cả các số nguyên có thể là bạn cần (có nghĩa là mật thông qua mười).
Sau đó, nếu bạn cũng có điều này:
sqlite> create table t (startrange int not null, endrange int not null);
sqlite> insert into t values(1, 3);
sqlite> create table target (i int not null);
Bạn có thể làm Phụ trang của bạn vào target
với một tham gia:
insert into target (i)
select ints.i
from ints join t on (ints.i >= t.startrange and ints.i <= t.endrange)
Kết quả là thế này:
sqlite> select * from target;
i
1
2
3
Dĩ nhiên t
thực của bạn sẽ có nhiều hàng hơn, do đó bạn muốn một mệnh đề WHERE để giới hạn hàng nào trong số t
bạn xem.
Những thứ tương tự thường được thực hiện với các ngày (tra cứu "bảng lịch"). Vì vậy, nếu phạm vi của bạn là nhỏ (đối với một số định nghĩa của nhỏ) sau đó tạo bảng ints
một lần, thêm chỉ mục vào đó và sử dụng kỹ thuật trên để thực hiện tất cả các quyền INSERT ngay bên trong cơ sở dữ liệu. Cơ sở dữ liệu khác có cách riêng của họ (chẳng hạn như PostgreSQL's generate_series
) để làm điều này loại mà không cần một bảng rõ ràng ints
nhưng SQLite là (cố ý) hạn chế.
SQL thường được thiết lập dựa trên các vòng lặp không phải là tự nhiên. Điều gì là tự nhiên là xây dựng các bộ thích hợp bằng cách mô tả những gì bạn cần. OTOH, đôi khi các hành động không tự nhiên là cần thiết và hợp lý.
Tôi không biết điều này có hợp lý với đơn đăng ký của bạn hay không, tôi chỉ nghĩ tôi sẽ chứng minh cách thực hiện. Nếu cách tiếp cận này không có ý nghĩa trong trường hợp của bạn thì bạn có thể tạo ra một loạt các câu lệnh INSERT bên ngoài cơ sở dữ liệu.
Các bảng SQLite có các số hàng có thể được sử dụng trong các truy vấn. – reinierpost
@reinierpost Bạn đang đề cập đến 'rowid'? –
Có. (và với tên của bạn, nó là * vẫn * quá ngắn) – reinierpost
Bạn có thể tạo vòng lặp trong SQL bằng trình kích hoạt đệ quy.Sử dụng mu quá ngắn 's schema
sqlite> create table t (startrange int not null, endrange int not null);
sqlite> insert into t values(1, 3);
sqlite> create table target (i int not null);
chúng ta cần phải kích hoạt trigger đệ quy trong SQLite:
sqlite> PRAGMA recursive_triggers = on;
Hãy kích hoạt tạm thời để lặp đến khi kết thúc của dãy núi này:
sqlite> create temp trigger ttrig
...> before insert on target
...> when new.i < (select t.endrange from t) begin
...> insert into target values (new.i + 1);
...> end;
Đá tắt:
sqlite> insert into target values ((select t.startrange from t));
sqlite> select * from target;
3
2
1
sqlite>
Đây là ma thuật đen tôi cần. Cảm ơn cậu! –
Rõ ràng cấu trúc lặp trong SQLite là mệnh đề WITH RECURSIVE. Liên kết tài liệu đó có mẫu đếm đến mười mã, một bộ vẽ Mandelbrot, và một bộ giải đố Sudoku, tất cả trong SQL thuần túy. Dưới đây là một truy vấn SQLite rằng tính dãy Fibonacci để cung cấp cho bạn một cảm giác về nó:
sqlite> WITH RECURSIVE
...> fibo (curr, next)
...> AS
...> (SELECT 1,1
...> UNION ALL
...> SELECT next, curr+next FROM fibo
...> LIMIT 100)
...> SELECT group_concat(curr) FROM fibo;
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,...
Và đây là một Sieve of Eratosthenes:
begin transaction;
drop table if exists naturals;
create table naturals
(n integer unique primary key asc,
isprime bool,
factor integer);
with recursive
nn (n)
as (
select 2
union all
select n+1 as newn from nn
where newn < 1e4
)
insert into naturals
select n, 1, null from nn;
insert or replace into naturals
with recursive
product (prime,composite)
as (
select n, n*n as sqr
from naturals
where sqr <= (select max(n) from naturals)
union all
select prime, composite+prime as prod
from
product
where
prod <= (select max(n) from naturals)
)
select n, 0, prime
from product join naturals
on (product.composite = naturals.n)
;
commit;
- 1. Nếu câu lệnh trong bộ lặp
- 2. mẫu freemarker cho câu lệnh vòng lặp
- 3. Số hàng được trả về trong câu lệnh sqlite
- 4. Sử dụng câu lệnh LIMIT trong truy vấn SQLite
- 5. SQLite - Có thể chèn BLOB qua câu lệnh chèn không?
- 6. câu lệnh chuẩn bị sqlite - cách gỡ lỗi
- 7. Simple câu hỏi sqlite
- 8. Câu hỏi SQLite SQLite: số hàng của truy vấn?
- 9. Nhiều câu lệnh SQL trong vòng lặp FORALL
- 10. Câu lệnh ghép nhiều câu lệnh SQL
- 11. Câu lệnh và câu lệnh "là" là
- 12. Thêm vào bản đồ scala trong vòng lặp cho câu lệnh vòng lặp và điều kiện
- 13. Hiệu suất báo cáo vòng lặp và phân bổ trước câu lệnh vòng lặp
- 14. SQLite: autoincrement câu hỏi khóa chính
- 15. Trong SQLite, các câu lệnh chuẩn bị có thực sự cải thiện hiệu suất không?
- 16. câu lệnh chèn có điều kiện trong các kích hoạt sqlite
- 17. Ưu tiên của nhiều câu lệnh JOIN trong sqlite là gì?
- 18. Làm thế nào để đặt câu lệnh PRAGMA SQLite với SQLAlchemy
- 19. Lấy số hàng bị ảnh hưởng cho câu lệnh SQLite bằng cách sử dụng API C
- 20. Simple câu lệnh if vs bình thường câu lệnh if
- 21. Câu hỏi về Hiệu suất của Câu lệnh JavaScript
- 22. Nhiều câu lệnh Firebird
- 23. Java Câu hỏi: Có thể có câu lệnh chuyển đổi trong một câu lệnh khác không?
- 24. cách thoát khỏi tập lệnh python trong câu lệnh if
- 25. Tuần tự hóa và câu lệnh Yield
- 26. Câu lệnh Switch/Case trong C++
- 27. sqlite từ lệnh nhắc lệnh không được nhận dạng
- 28. Truy vấn LINQ với nhiều câu lệnh OrderBy được thêm vào trong vòng lặp
- 29. Nhãn được sử dụng với các câu lệnh không phải là vòng lặp như thế nào?
- 30. Cách tránh chèn bản ghi trùng lặp khi sử dụng câu lệnh T-SQL Merge
Tôi sợ bạn sẽ cần phải viết một số mã bắt buộc phải làm nó, SQL nói chung là một ngôn ngữ khai báo và chỉ các phần mở rộng của nó (như T-SQL, SQL/PL, vv) hỗ trợ các cấu trúc điều khiển luồng như vòng lặp. Tuy nhiên, nếu cần phải thực hiện việc chèn trong một lần chạy bằng cách sử dụng các giao dịch SQLite. –
Perl/Python/Ruby-script-to-the-rescue! :) –
Điều này có nên được chuyển đến dba.stackexchange.com không? – anddam