我有两张桌子:
create table CurrentDay (
ID int identity primary key,
ssn varchar(10),
val money,
CheckDate datetime,
CurrentStatus tinyint)
create table PreviousDay (
ID int identity primary key,
ssn varchar(10),
val money,
CheckDate datetime,
CurrentStatus tinyint)我需要具有以下值的update字段CurrentDay.CurrentStatus:
CurrentDay;
我编写了一些查询,但是我希望能够找到其他方法来完成这个任务,只使用PreviousDay和CurrentDay表之间的一个连接。显然,这不是一个非常幸运的kind...Here是我的变体:
Update CurrentDay
Set CurrentStatus=case
when exists (select PreviousDay.ID from PreviousDay
where PreviousDay.ssn=CurrentDay.ssn AND
PreviousDay.val=CurrentDay.val AND
PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate))
then 111
when exists (select PreviousDay.ID from PreviousDay
where PreviousDay.ssn=CurrentDay.ssn AND
PreviousDay.val>CurrentDay.val AND
PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate))
then 112
when exists (select PreviousDay.ID from PreviousDay
where PreviousDay.ssn=CurrentDay.ssn AND
PreviousDay.val<CurrentDay.val AND
PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate))
then 113
when exists (select PreviousDay.ID from PreviousDay
where PreviousDay.ssn!=CurrentDay.ssn AND
PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate))
then 114
end;这里还有其他查询,但在这种情况下,我不能用值114更新CurrentDay.CurrentStatus‘fieid,因为这两个表中只有匹配的行:
Set Currentday.CurrentStatus=(select 111 where PreviousDay.val=CurrentDay.val union all select 112 where and PreviousDay.val>CurrentDay.val union all select 113 where and PreviousDay.val<CurrentDay.val /*union all select 114 */ ) from PreviousDay join CurrentDay on PreviousDay.ssn=CurrentDay.ssn and PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate)
你还有别的主意吗?
发布于 2009-12-27 17:15:11
类似于:
UPDATE
C
Set
CurrentStatus = CASE
WHEN P.val = C.val THEN 111
WHEN P.val > C.val THEN 112
WHEN P.val < C.val THEN 113
ELSE 114 ---this works because if P.VAL is null, that is no matching row
END
FROM
CurrentDay C
LEFT JOIN
PreviousDay P On C.ssn = P.ssn AND P.CheckDate = DATEADD(day, -1, C.CheckDate))发布于 2009-12-27 17:12:59
你可以试试这样的东西
UPDATE CurrentDay
SET CurrentStatus =
CASE
WHEN cd.val = pd.val THEN 111
WHEN cd.val < pd.val THEN 112
WHEN cd.val > pd.val THEN 113
WHEN pd.val IS NULL THEN 114
END
FROM CurrentDay cd LEFT JOIN
PreviousDay pd ON cd.ssn = pd.ssn
AND cd.CheckDate = DATEADD(d, 1, pd.CheckDate)这是我的测试代码。使用val条目查看PreviousDay是否有效,或者完全删除PreviousDay条目以查看新条目选项。
DECLARE @CurrentDay table (
ID int identity primary key,
ssn varchar(10),
val money,
CheckDate datetime,
CurrentStatus tinyint)
DECLARE @PreviousDay table (
ID int identity primary key,
ssn varchar(10),
val money,
CheckDate datetime,
CurrentStatus tinyint)
INSERT INTO @CurrentDay (ssn, val, CheckDate) SELECT 1, 1, '02 Jan 2009'
INSERT INTO @PreviousDay (ssn, val, CheckDate) SELECT 1, 0, '01 Jan 2009'
UPDATE @CurrentDay
SET CurrentStatus =
CASE
WHEN cd.val = pd.val THEN 111
WHEN cd.val < pd.val THEN 112
WHEN cd.val > pd.val THEN 113
WHEN pd.val IS NULL THEN 114
END
FROM @CurrentDay cd LEFT JOIN
@PreviousDay pd ON cd.ssn = pd.ssn
AND cd.CheckDate = DATEADD(d, 1, pd.CheckDate)
SELECT * FROM @CurrentDayhttps://stackoverflow.com/questions/1966409
复制相似问题