web-dev-qa-db-ja.com

UPDATEステートメントでのHAVING句の使用

このクエリ

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

ISValidビットを0に設定したいレコードを選択します。

これらのレコードは、入力エラーのためにデータベースに2回表示されるレコードです。

私は次のようなものを探しています:

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

これはMSSQL SERVER2008にあります

ありがとう!

10
Tyler DeWitt

次のように、そのサブクエリに参加できます。

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
17
Eric

SQL Serverは、次のような更新を実行できます。

UPDATE table SET col=vaue
FROM (
  SELECT ......
)

最初にここを見る必要があります:

http://msdn.Microsoft.com/en-us/library/aa260662(v = sql.80).aspx

2
Mithrandir

上記は良い提案です....これを行う別の簡単な方法があります:

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
) 

**列の名前をめちゃくちゃにした場合は許してください、しかしあなたはその考えを理解します。

2

CTEを使用し、基本的に自己結合とは何かを実行します

;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

またはさらに良いことに、ウィンドウ関数を使用します。

;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

Secondは、「最初の」レコードを無効に更新せず、NCAAstatsとCollege_Translatorの間に1対1の関係があることを前提としていることに注意してください。

1
jmoreno