Использование предложения HAVING в инструкции 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
Выбирает записи, которые я хотел бы установить ISValid
немного 0
,
Эти записи являются записями, которые дважды появляются в моей базе данных из-за ошибки ввода.
Я ищу что-то вроде:
UPDATE NCAAstats
SET IsValid = 0
WHERE (my select statement)
Это на MS SQL SERVER 2008
Спасибо!
4 ответа
Вы можете присоединиться к этому подзапросу следующим образом:
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
SQL Server может делать обновления, такие как:
UPDATE table SET col=vaue
FROM (
SELECT ......
)
Вы должны посмотреть здесь сначала:
http://msdn.microsoft.com/en-us/library/aa260662(v=sql.80).aspx
Выше приведены хорошие предложения.... вот еще один простой способ сделать это:
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
)
** Простите, если я испортил название столбцов, но вы поняли идею.
Используйте 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.
Для SQL Server 17
UPDATE table SET col = val
(SELECT cols FROM table .. )