sql子查询更新有2个条件

时间:2013-05-20 15:45:30

标签: sql sql-server

我有两张桌子

发布

int_PostId , dtm_Publishdate               createddate
1             2013-02-07 21:12:03.247
2             2013-03-07 21:12:03.247
3             2013-03-07 21:12:03.247

和postmeta

int_postmetaid, metakey ,     metavalue ,     int_PostId , int createddate
   1              chk           en                1             2013-02-07  
   2              chk           ps                1             2013-02-07  
   3              chk           cs                1             2013-02-07  
   4             publishdate     2013-03-07       1             2013-02-07
   5              chk           en                2             2013-02-07  
   6              chk           ps                2             2013-02-07  
   7              chk           cs                2             2013-02-07    
   8             publishdate     2013-03-07       2             2013-02-07
   9              chk           en                3             2013-02-07  
   10              chk           ps               3             2013-02-07  
   11              chk           cs               3             2013-02-07  

我想用这些条件更新帖子的dtm_Publishdate列。我想在一个查询中做到这一点

1)如果 publishdate 元关键字存在于postmeta表更新帖子的 * dtm_Publishdate * 中,并带有metavalue

2)如果它不存在则用它的createddate更新帖子的dtm_Publishdate

我真的陷入了这种情况。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

只要您使用的是SQL Server 2008或更高版本,请使用the MERGE statement

MERGE INTO post as Target
USING (SELECT int_PostId,metavalue 
    FROM postmeta 
    WHERE metakey='publishdate') 
    as Source (int_PostId,metavalue)
ON Source.int_PostId = Target.int_PostId
WHEN MATCHED THEN 
    UPDATE SET Target.dtm_Publishdate = Source.metavalue
WHEN NOT MATCHED THEN 
    UPDATE SET Target.dtm_Publishdate = Target.createddate

您可能需要将元数据列转换为WHEN MATCHED子句中的DateTime类型。

答案 1 :(得分:0)

如果在postmeta中只有一个发布日期行,你可以尝试这样的事情:

UPDATE post 
SET dtm_publishdate =
    CASE WHEN pd.metavalue IS NOT NULL
        THEN metavalue
        ELSE createddate
    END
FROM
    post p LEFT OUTER JOIN
    (SELECT
        int_postID, metavalue
    FROM 
        post p INNER JOIN
        postmeta m ON
        p.int_postID = m.int_postID
    WHERE
        metakey = 'publishdate') pd ON
    p.int_postid = pd.int_postID