2010-05-17 37 views
29

Tôi đang cố gắng để thực hiện điều này trên MS-SQL nhưng trả về cho tôi một lỗi chỉ tại Tập đoàn bởi dòngSQL Server Update Đoàn tự do

update #temp 
Set Dos=Count(1) 
From Temp_Table2010 s 
where Id=s.Total and s.total in (Select Id from #temp) 
group by s.Total 

Làm bất cứ ai biết làm thế nào tôi có thể giải quyết vấn đề này có hiệu suất tốt.

+0

Bạn có thể mô tả những gì bạn đang cố gắng làm ở đây không? Tôi sẽ cố gắng giúp bạn viết lại truy vấn, nhưng tôi không thể tìm ra những gì bạn đang cố gắng hoàn thành. Vì tên bảng không có ý nghĩa, có thể ít nhất bạn cũng có thể cung cấp danh sách các cột trong mỗi mẫu và một mẫu dữ liệu bạn đang xem. – SqlRyan

Trả lời

11

Bạn không thể sử dụng tổng hợp trong truy vấn UPDATE, cho người mới bắt đầu - mặc dù bạn không bao gồm thông báo lỗi trong câu hỏi ban đầu của mình, tôi nghi ngờ đó là những gì nó cho bạn biết.

Bạn cần tính tổng hợp trước khi cập nhật và lưu trữ kết quả trong bảng tạm thời, sau đó tham gia bảng đó để cập nhật.

48

Hãy thử

;with counts 
AS 
( 
    SELECT total, COUNT(*) as dos 
    FROM temp_table2010 
    WHERE total in (select id from #temp) 
) 
UPDATE T 
SET dos=counts.dos 
FROM #temp T 
INNER JOIN counts 
    ON t.id = counts.total 
+3

điều này được gọi là sử dụng một biểu thức bảng chung (hoặc CTE.) Một số tài liệu - https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx và https: // msdn.microsoft.com/en-us/library/ms175972.aspx – mmcrae

+0

Có gì với dấu chấm phẩy ở đầu '; với số đếm', điều đó có phục vụ mục đích khác ngoài việc đóng câu lệnh trước đó không? – Splatmistro

+0

"với" có nghĩa là một cái gì đó khác khi nó không phải là sự khởi đầu của một tuyên bố. Dấu chấm phẩy là tùy chọn trong T-sql để trình phân tích cú pháp phải suy ra nơi dấu chấm phẩy nên đi. Nếu có một câu lệnh chọn ngay lập tức đặt trước CTE, thì nó sẽ trở nên phi thường đối với trình phân tích cú pháp nếu có là một phần của câu lệnh trước đó hoặc nó là của riêng nó. dấu chấm phẩy hàng đầu làm cho điều đó rõ ràng. Nó đã được thông qua như một quy ước để ngăn chặn bất kỳ vấn đề phân tích cú pháp nào. –

14

Trong SQL Server bạn có thể làm kết hợp trong một truy vấn cập nhật bạn chỉ cần làm điều đó trong một subquery và sau đó tham gia nó trên bảng bạn muốn cập nhật.

UPDATE #temp 
SET  Dos = Cnt 
FROM #temp 
    INNER JOIN (SELECT Total, COUNT(*) AS Cnt FROM Temp_Table2010 GROUP BY Total) AS s 
     ON Id = s.Total 

Việc làm này:

WHERE total in (select id from #temp) 

Và sau đó:

INNER JOIN counts 
    ON t.id = counts.total 

là không cần thiết.

Tham gia giải quyết yêu cầu "tổng cộng (...)". Nhóm trên khóa và sau đó tham gia.

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