2012-01-09 41 views
8

tego zapytaniaKorzystanie z klauzuli HAVING w instrukcji 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 

Wybiera rekordy, które chciałbym ustawić ISValid kawałek 0.

Te rekordy są rekordami, które pojawiają się dwukrotnie w mojej bazie danych z powodu błędu wejścia.

szukam czegoś podobnego:

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

To jest na MS SQL Server 2008

Dzięki!

Odpowiedz

12

Możesz dołączyć do tej podzapytaniu tak:

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

powyżej są dobrymi sugestiami .... oto kolejny prosty sposób na zrobienie tego:

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 
) 

** Przebacz mi, gdybym zawalił nazwę kolumny, ale masz pomysł.

+0

To, co jest warte, będzie działać bardzo wolno, ponieważ podzapytanie zostanie wykonane w każdym wierszu. – Eric

+2

@Eric - Nie sądzę, że tak będzie. Na czym to bazujesz? – JNK

+0

@JNK - Masz rację - "in" powoduje semi join w SQL 2008. Moja wina - zapomniałem o silniku. Przepraszamy za zamieszanie :) – Eric

1

Użyj CTE, i robić to, co jest w zasadzie samo dołączyć

;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 

albo jeszcze lepiej, korzystać z funkcji okienkowania.

;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 

Zauważ, że drugi nie aktualizuje „pierwszy” rekord nieważny, i że zakłada, że ​​istnieje, że jest 1 do 1 związek między NCAAstats i College_Translator.