SQL server:根据其他表值填充列

时间:2011-09-20 21:33:40

标签: sql

我有两张桌子: 表A

ID AID  BID   Status
1  100  1000
2  101  1001
3  102  1000

依旧......

表B

AID BID
100  1000
101  1008
107  1001

现在我想填充tableA,状态为'FAIL',如果: 1.对于表A中的AID,其对应的BID应该等于tableB的相同值 2.如果tableB中相应的BID不相同,请确保它在tableB中不存在意味着BID是TableB中不存在的新值

实施例: TableA,AID = 100 BID = 1000.现在这个AID = 100应该查看tableB;在表B中为AID 100; BID = 1000所以它不是失败。

  1. 因此,对于AID 100,BID应为1000(来自tableB)或TableB.BID中不存在的任何其他新值,不论AID如何。

  2. A.AID = 101 BID = 1001但B.AID = 107存在此BID值,因此其失败。 预期结果:

        ID AID  BID   Status
        1  100  1000  NULL
        2  101  1001  FAIL
        3  102  1000  FAIL
    

    由于

3 个答案:

答案 0 :(得分:2)

Update TableA
Set Status =   Case
               When Exists (
                           Select 1
                           From TableB
                           Where TableB.AID = TableA.AID
                               And TableB.BID = TableA.BID
                           ) Then Null
                When Not Exists (
                                Select 1
                                From TableB
                                Where TableB.BID = TableA.BID
                                ) Then Null
                Else 'FAIL'
                End

答案 1 :(得分:2)

在看别的东西时偶然发现了这个未回答的问题。 这两个查询顺序相同,似乎是一个简单的答案:

  update TableA
    set Status = 'F'

    update TableA T
    Set Status = 'N'
    where T.ID in (Select A.ID from TableA A, TableB B
                                    where A.AID = B.AID and A.BID = B.BID)

答案 2 :(得分:1)

我正在使用 bigint 作为数据类型,因为我根本不知道类型之王是什么......
无论如何这应该有所帮助:

DECLARE @ID bigint, @BID bigint

DECLARE CURSOR_CHECK CURSOR FOR
SELECT ID, BID FROM tableA

OPEN CURSOR_CHECK
FETCH NEXT FROM CURSOR_CHECK INTO @ID, @BID

BEGIN TRANSACTION

WHILE @@FETCH_STATUS == 0
BEGIN

   IF ((SELECT COUNT(*) FROM tableB WHERE BID = @BID) > 1)
      UPDATE tableA SET status = 'FAIL' WHERE id = @ID

   FETCH NEXT FROM CURSOR_CHECK INTO @ID, @BID

END

COMMIT
相关问题