2011-11-28 47 views
5

Tôi rất mới ở các tập lệnh SQL và không thể tìm ra cách làm cho từng vòng lặp cụ thể. Tôi cần phải làm một việc như sau:Vòng lặp foreach của SQL

Tôi có các bảng SitesSiteCrawls.

Về cơ bản, đối với mọi trang web tôi cần tạo SiteCrawl mới và cột Site_ID của SiteCrawl sẽ bằng với ID của trang web đó.

Tôi làm cách nào để thực hiện việc này?

+4

Một từ: ** không làm điều đó ** với một vòng lặp foreach - SQL là ** bộ dựa trên ** - bạn nghĩ và hoạt động trong ** bộ dữ liệu **. Sử dụng RBAR (hàng-by-agonizing-hàng) như một vòng lặp foreach là rất xấu cho hiệu suất –

Trả lời

12
insert SiteCrawl 
(
    Site_ID 
) 
select 
s.Site_ID 
from Site as s 
where s.Site_ID not in (select Site_ID from SiteCrawl) 
4
insert into site_crawl (site_id) values (select site_id from site); 

Vì vậy, về cơ bản: không có cụ thể cho/mỗi trong SQL đơn giản, bạn xử lý các bảng và hàng kết quả luôn là một tuyên bố. Vì vậy, bạn cũng có thể nói: không có cách nào một tuyên bố SQL là cái gì khác hơn là cho/mỗi. Với kiến ​​thức đó, bạn có thể thấy rằng truy vấn trên sẽ chèn một hàng vào site_crawl cho mỗi site_id trong bảng trang web. Bạn có nhiều khả năng muốn sử dụng nhiều giá trị hơn số này, nhưng được cung cấp thông tin từ câu hỏi của bạn là tất cả những gì tôi có thể làm cho bạn :)

Ngoài ra: bạn muốn đọc thêm về sql là gì và cách sử dụng.

Vui chơi, SQL rất thú vị!

+0

Cảm ơn bạn đã phản hồi của bạn. Như tôi đã nói, thực sự mới ở sql và chắc chắn sẽ làm việc trên nó. – ygit

1
insert into SiteCrawls (SiteID) 
select SiteID 
    from Sites 
+0

Chỉ có cùng một vấn đề, điều đó đã giúp. –

3

Trong SQL bạn thường không muốn để lặp qua tất cả các kỷ lục. Nó rất kém hiệu quả.

Bạn có thể làm một cái gì đó giống như

insert into SiteCrawl (Site_Id) 
select Id from Sites 
1

bạn có thể làm điều đó bằng cách kích hoạt

CREATE TRIGGER tg AFTER INSERT ON `Sites` 
FOR EACH ROW 
BEGIN 
insert into SiteCrawls(Site_ID) values (NEW.id); 
END 
; 
+0

+1 thats rất có thể overkill cho vấn đề nhất định, nhưng một giải pháp tốt đẹp. –

Các vấn đề liên quan