我有一张表要更新。要更新的值是数据表上 PK ID 的 FK。
数据表具有日期范围,并且正在更新的表具有出生日期字段(月、日、年)。我的 Update 语句可以遍历所有记录 RBAR(逐行排列)但我希望使用更多基于集合的解决方案。我已经尝试在 update 语句的 from 子句中使用 case 语句和表连接,但是关于这个问题的一些事情让我不知道如何处理它。这是表模式和我对更新语句的尝试
Table 1 Person:
TABLE [dbo].[TFI_PERSON](
[PERSON_ID] [int] IDENTITY(3500,1) NOT NULL,
[HOROSCOPE_SIGN_ID] [int] NULL,
[DOB_DAY] [int] NOT NULL,
[DOB_MONTH] [int] NOT NULL,
[DOB_YEAR] [int] NOT NULL,
表 2 星座
TABLE [dbo].[TFI_HOROSCOPE_SIGN](
[HOROSCOPE_SIGN_ID] [int] IDENTITY(1,1) NOT NULL,
[HOROSCOPE_SIGN] [nvarchar](100) NOT NULL,
[HOROSCOPE_BEGIN_DATE] [datetime] NOT NULL,
[HOROSCOPE_END_DATE] [datetime] NOT NULL,
尝试 1 和 2
UPDATE P
SET P.HOROSCOPE_SIGN_ID = HS.[HOROSCOPE_SIGN_ID]
FROM dbo.TFI_PERSON AS P JOIN [dbo].[TFI_HOROSCOPE_SIGN] AS HS
ON P.[HOROSCOPE_SIGN_ID] = HS.[HOROSCOPE_SIGN_ID]
WHERE
CAST(DOB_YEAR AS NVARCHAR)+ '-' + CAST(DOB_MONTH AS NVARCHAR) + '-' + CAST(DOB_DAY AS NVARCHAR) BETWEEN HS.[HOROSCOPE_BEGIN_DATE] AND HS.[HOROSCOPE_END_DATE]
UPDATE dbo.TFI_PERSON
SET HOROSCOPE_SIGN_ID = (SELECT HOROSCOPE_SIGN_ID
FROM dbo.TFI_HOROSCOPE_SIGN
WHERE CAST(CAST(DOB_YEAR AS NVARCHAR)+ '/' + CAST(DOB_MONTH AS NVARCHAR) + '/' + CAST(DOB_DAY AS NVARCHAR) AS DATETIME) BETWEEN [HOROSCOPE_BEGIN_DATE] AND [HOROSCOPE_END_DATE] )
感谢您的协助。