[SQL] 서브 쿼리와 MySQL을 업데이트 쿼리
SQL서브 쿼리와 MySQL을 업데이트 쿼리
사람이 쿼리 아래의 잘못이 무엇인지 볼 수 있을까요?
내가 그것을 실행하면 내가 얻을 :
Update Competition
Set Competition.NumberOfTeams =
(
SELECT count(*) as NumberOfTeams
FROM PicksPoints
where UserCompetitionID is not NULL
group by CompetitionID
) a
where a.CompetitionID = Competition.CompetitionID
해결법
-
==============================
1.주요 문제는 어디 필터가 테이블 내부 하위 쿼리도가 실행되기 전에 업데이트되고 먼저 적용되기 때문에 내부 쿼리가 외부 업데이트 문에 당신의 where 절과 관련이있을 수 없다는 것입니다. 이 같은 상황을 처리하는 일반적인 방법은 멀티 테이블 업데이트입니다.
주요 문제는 어디 필터가 테이블 내부 하위 쿼리도가 실행되기 전에 업데이트되고 먼저 적용되기 때문에 내부 쿼리가 외부 업데이트 문에 당신의 where 절과 관련이있을 수 없다는 것입니다. 이 같은 상황을 처리하는 일반적인 방법은 멀티 테이블 업데이트입니다.
Update Competition as C inner join ( select CompetitionId, count(*) as NumberOfTeams from PicksPoints as p where UserCompetitionID is not NULL group by CompetitionID ) as A on C.CompetitionID = A.CompetitionID set C.NumberOfTeams = A.NumberOfTeams
데모 : http://www.sqlfiddle.com/#!2/a74f3/1
-
==============================
2.감사합니다, 나는 내부 조인과 UPDATE의 생각을하지 않았다.
감사합니다, 나는 내부 조인과 UPDATE의 생각을하지 않았다.
원래 쿼리에서 실수 값을 반환해야하기 때문에 별명 할 수없는 하위 쿼리를, 이름이었다.
UPDATE Competition SET Competition.NumberOfTeams = (SELECT count(*) -- no column alias FROM PicksPoints WHERE UserCompetitionID is not NULL -- put the join condition INSIDE the subquery : AND CompetitionID = Competition.CompetitionID group by CompetitionID ) -- no table alias
대회의 모든 레코드에 대한 트릭을해야한다.
주목 될하려면 :
효과는 정확히없이 해당 PickPoints와 경쟁 레코드를 업데이트하지 않습니다 mellamokb에 의해 제안 된 쿼리와 동일하지 않습니다.
SELECT ID 이후 ID BY COUNT (*)는 단지 GROUP ID의 기존 값 계산되며
레코드가 선택하지 않은 경우 SELECT COUNT 반면 (*)는 항상 0이되고, 값을 반환한다.
이것은, 또는하지 않을 수 있습니다, 당신을 위해 문제가있을 수 있습니다.
mellamokb 쿼리의 0 인식 버전은 다음과 같습니다
Update Competition as C LEFT join ( select CompetitionId, count(*) as NumberOfTeams from PicksPoints as p where UserCompetitionID is not NULL group by CompetitionID ) as A on C.CompetitionID = A.CompetitionID set C.NumberOfTeams = IFNULL(A.NumberOfTeams, 0)
해당하는 PickPoints이 발견되지 않은 경우 즉, 제로로 Competition.NumberOfTeams을 설정합니다.
-
==============================
3.참을성 경우 :
참을성 경우 :
UPDATE target AS t INNER JOIN ( SELECT s.id, COUNT(*) AS count FROM source_grouped AS s -- WHERE s.custom_condition IS (true) GROUP BY s.id ) AS aggregate ON aggregate.id = t.id SET t.count = aggregate.count
mellamokb의 대답 @ 그의는, 위와 같이, 최대로 감소.
from https://stackoverflow.com/questions/11588710/mysql-update-query-with-sub-query by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 조건 SQL 합 (0) | 2020.05.19 |
---|---|
[SQL] 방법 정규식에서 MySQL의 쿼리 (0) | 2020.05.19 |
[SQL] 역사 / 감사 데이터베이스 (0) | 2020.05.19 |
[SQL] SQL 쿼리는 여러 테이블을 조인 - 너무 느린 (8 표) (0) | 2020.05.19 |
[SQL] 방법과 같은이 SQL에서 조인을 사용하는? (0) | 2020.05.19 |