2012-01-09 40 views
8

Truy vấn nàySử dụng một mệnh đề HAVING trong một câu lệnh UPDATE

SELECT 
FirstName, LastName, NCAAStats.AccountId, College_Translator.school_name, StatTypeId, COUNT(*) AS 'Count' 
FROM NCAAstats 
INNER JOIN College_Translator 
ON College_Translator.AccountID = NCAAstats.AccountId 
GROUP BY FirstName, LastName, NCAAStats.AccountId, College_Translator.school_name, CalendarYear, StatTypeId 
HAVING COUNT(*) >1 
ORDER BY 'Count' DESC 

Chọn hồ sơ mà tôi muốn thiết lập một chút ISValid-0.

Các bản ghi này là các bản ghi xuất hiện hai lần trong cơ sở dữ liệu của tôi do lỗi đầu vào.

Tôi đang tìm một cái gì đó như:

UPDATE NCAAstats 
SET IsValid = 0 
WHERE (my select statement) 

Đây là trên MS SQL SERVER 2008

Cảm ơn!

Trả lời

12

Bạn có thể tham gia vào subquery đó như sau:

update n1 set 
    isvalid = 0 
from 
    ncaastats n1 
    inner join (
     SELECT 
     FirstName, LastName, NCAAStats.AccountId, College_Translator.school_name, StatTypeId, COUNT(*) AS 'Count' 
     FROM NCAAstats 
     INNER JOIN College_Translator 
     ON College_Translator.AccountID = NCAAstats.AccountId 
     GROUP BY FirstName, LastName, NCAAStats.AccountId, College_Translator.school_name, CalendarYear, StatTypeId 
     HAVING COUNT(*) >1 
    ) n2 on 
     n1.accountid = n2.accountid 
2

Các ở trên là những gợi ý tốt .... đây là một cách dễ dàng để làm điều đó:

update ncaastats set isvalid = 0 
where accountId in (
    SELECT AccountId 
    FROM NCAAstats 
    INNER JOIN College_Translator 
    ON College_Translator.AccountID = NCAAstats.AccountId 
    GROUP BY FirstName, LastName, NCAAStats.AccountId, College_Translator.school_name, CalendarYear, StatTypeId 
    HAVING COUNT(*) >1 
) 

** Tha thứ cho tôi nếu tôi làm sai tên cột, nhưng bạn có ý tưởng.

+0

Đối với những gì nó đáng giá, điều đó sẽ thực sự chậm, vì truy vấn con sẽ được thực hiện đối với mỗi hàng. – Eric

+2

@Eric - Tôi không nghĩ điều đó sẽ xảy ra. bạn đang dựa vào điều gì? – JNK

+0

@JNK - Bạn đúng - 'in' gây ra sự tham gia bán vào SQL 2008. Lỗi của tôi - quên động cơ. Xin lỗi vì sự nhầm lẫn :) – Eric

1

Sử dụng một CTE, và làm những gì cơ bản là một tự tham gia

;with NCAAstatsToUpdate(
    SELECT AccountId 
    FROM NCAAstats n 
     INNER JOIN College_Translator ct 
     ON ct.AccountID = n.AccountId 
    GROUP BY FirstName, LastName, n.AccountId, ct.school_name, 
     CalendarYear, StatTypeId 
    HAVING COUNT(*) >1) 
UPDATE NCAAstats 
SET IsValid=0 
FROM NCAAstats n 
inner join NCAAstatsToUpdate u 
    on n.AccountId = u.AccountId 

Hoặc tốt hơn, sử dụng các chức năng cửa sổ.

;with NCStats as(
Select distinct row_number() over (partition by FirstName, LastName, n.AccountId, ct.school_name, 
     CalendarYear, StatTypeId order by n.accountId) rw, n.* 
FROM NCAAstats n 
     INNER JOIN College_Translator ct 
     ON ct.AccountID = n.AccountId 
) 
Update NCStats 
Set IsValid=0 
Where rw>1 

Lưu ý rằng thứ hai không cập nhật bản ghi "đầu tiên" thành không hợp lệ và giả định rằng có mối quan hệ 1-1 giữa NCAAstats và College_Translator.

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