繁体   English   中英

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

[英]SQL server: populating a column based on other table values

我有两个表:TableA

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.对于tableA中的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无关。

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

谢谢

看着其他东西时,偶然发现了这个悬而未决的问题。 这两个查询以相同的顺序似乎是一个简单的答案:

  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)
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

我使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM