检查列是否包含行值

时间:2018-06-01 02:19:43

标签: sql sql-server

如果在列中找到特定值,我正在尝试更新标志。例如,如果在key2的整个列中找到key1,则flag为Y,否则为N。

我在下面写了这个查询,但它失败了:

UPDATE dbo.WRK_DATA
SET flag = CASE WHEN EXISTS (SELECT * FROM dbo.WRK_DATA WHERE key1 = key2) 
                THEN 'Y'
                ELSE 'N' END

见下表:

key1| key2 | Flag
20a | 10a  | N
45a | 35a  | Y
55a | 45a  | N
45a | 35a  | Y

提前致谢。

3 个答案:

答案 0 :(得分:3)

您也可以将此短语称为更新自我加入:

UPDATE a
SET flag = CASE WHEN b.key2 IS NOT NULL THEN 'Y' ELSE 'N' END
FROM dbo.WRK_DATA a
LEFT JOIN dbo.WRK_DATA b
    ON a.key1 = b.key2;

或者,如果你想坚持目前的方法,那么看看戈登的答案。

答案 1 :(得分:0)

您需要表别名:

update d1
    set flag = (case when exists (select 1
                                  from dbo.WRK_DATA d2
                                  where d1.key1 = d2.key2
                                 )
                     then 'Y' else 'N'
                end)
    from dbo.WRK_DATA d1;

答案 2 :(得分:0)

    CREATE TABLE #temp
        (
          key1 VARCHAR(3) ,
          key2 VARCHAR(3) ,
          Flag CHAR(1)
        );

    INSERT  INTO #temp
            ( key1, key2, Flag )
    VALUES  ( '20a', -- key1 - varchar(3)
              '10a', -- key2 - varchar(3)
              ''  -- Flag - char(1)
              ),
            ( '45a', -- key1 - varchar(3)
              '35a', -- key2 - varchar(3)
              ''  -- Flag - char(1)
              ),
            ( '55a', -- key1 - varchar(3)
              '45a', -- key2 - varchar(3)
              ''  -- Flag - char(1)
              ),
            ( '45a', -- key1 - varchar(3)
              '35a', -- key2 - varchar(3)
              ''  -- Flag - char(1)
              ),
            ( '45a', -- key1 - varchar(3)
              '45a', -- key2 - varchar(3)
              ''  -- Flag - char(1)
              );

    UPDATE  a
    SET     Flag = CASE WHEN b.key2 = a.key1 THEN 'Y'
                        ELSE 'N'
                   END
    FROM    #temp a
            LEFT JOIN #temp b
                ON a.key1 = b.key2;


    SELECT  *
    FROM    #temp;

    DROP TABLE #temp;