programing

SQL Server: 존재하는 경우; ELSE

instargram 2023. 7. 16. 12:30
반응형

SQL Server: 존재하는 경우; ELSE

자리가 있습니다A:

ID value
 1  100
 2  101
 2  444
 3  501

표 B도 있습니다.

ID Code
1
2

이제 표 A에 ID = 2가 있으면 표 B의 col = 코드를 채우고 싶습니다.여러 값의 경우 최대값을 가져옵니다.그렇지 않으면 '123'으로 입력합니다.이제 제가 사용한 것은 다음과 같습니다.

if exists (select MAX(value) from #A where id = 2)
 BEGIN
 update #B
 set code = (select MAX(value) from #A where id = 2)
 from #A
 END

 ELSE 

 update #B
 set code = 123
 from #B

BEGIN;END 또는 IF EXPRESS;ELSE에 문제가 있다고 확신합니다.기본적으로 if-part에 select 문이 있고 그 반대의 경우에는 다른 부분을 바이패스하고 싶습니다.예를 들어, IF=part의 select 문이 다음과 같은 경우:

(select MAX(value) from #A where id = 4)

123만 채워야 합니다. coz ID = 4는 존재하지 않습니다!

편집

나는 당신의 이유를 덧붙이고 싶습니다.IF문이 작동하지 않는 것 같습니다.당신이 할 때EXISTS종합적으로 보면, 그것은 항상.true값을 반환하는 경우에도 값을 반환합니다.ID존재하지 않습니다.물론입니다.NULL하지만 그것은 그것을 돌려줍니다.대신 다음 작업을 수행합니다.

if exists(select 1 from table where id = 4)

그러면 당신은 거기에 도착할 것입니다.ELSE당신의 일부IF진술.


이제 더 나은 세트 기반 솔루션이 있습니다.

update b
  set code = isnull(a.value, 123)
from #b b
left join (select id, max(value) from #a group by id) a
  on b.id = a.id
where
  b.id = yourid

이는 개별 ID가 아닌 전체 테이블에서 실행할 수 있다는 이점이 있습니다.

사용해 보십시오.

Update TableB Set
  Code = Coalesce(
    (Select Max(Value)
    From TableA 
    Where Id = b.Id), 123)
From TableB b

원래 게시물이 게시된 지 오래되었다는 것은 알지만 CTE를 사용하는 것을 좋아하고 이것이 저에게 효과가 있었습니다.

WITH cte_table_a
AS
(
    SELECT [id] [id]
    , MAX([value]) [value]
    FROM table_a
    GROUP BY [id]
)
UPDATE table_b
SET table_b.code = CASE WHEN cte_table_a.[value] IS NOT NULL THEN cte_table_a.[value] ELSE 124 END
FROM table_b
LEFT OUTER JOIN  cte_table_a
ON table_b.id = cte_table_a.id

언급URL : https://stackoverflow.com/questions/7425146/sql-server-if-exists-else

반응형