Использование предложения HAVING в инструкции UPDATE - PullRequest
10 голосов
/ 09 января 2012

Этот запрос

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.

Эти записи являются записями, которые дважды появляются в моей базе данных из-за ошибки ввода.

Я ищу что-то вроде:

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

Это на MS SQL SERVER 2008

Спасибо!

Ответы [ 5 ]

16 голосов
/ 09 января 2012

Вы можете присоединиться к этому подзапросу следующим образом:

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 голосов
/ 09 января 2012

Выше приведены хорошие предложения .... вот еще один простой способ сделать это:

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 голосов
/ 09 января 2012

SQL Server может делать обновления, такие как:

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

Сначала вы должны посмотреть здесь:

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

1 голос
/ 10 января 2012

Используйте 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

Обратите внимание, что секунда не обновляет "первая "запись недействительна и предполагает, что существует отношение 1: 1 между NCAAstats и College_Translator.

0 голосов
/ 31 мая 2019

Для SQL Server 17

UPDATE table SET col = val 
(SELECT cols FROM table .. )
...