简体   繁体   English

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

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

I have two tables: TableA 我有两个表:TableA

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

and so on... 等等...

TableB 表B

AID BID
100  1000
101  1008
107  1001

Now I want to populate tableA, status with 'FAIL' if: 1.for AID in tableA, its corresponding BID should be equal to same values of tableB 2. If corresponding BID is not same in tableB, make sure it dont exist in tableB means BID is a new value which dont exist in TableB 现在,我要填充tableA,状态为'FAIL',如果:1.对于tableA中的AID,其对应的BID应该等于tableB的相同值。2.如果tableB中对应的BID不相同,请确保它在tableB中不存在表示BID是TableB中不存在的新值

Example: TableA, AID = 100 BID = 1000. now this AID = 100 should be looked into tableB; 例如:TableA,AID = 100 BID =1000。现在应将此AID = 100放入tableB; in tableB for AID 100; 在表B中获得AID 100; BID = 1000 so its not a fail. BID = 1000,因此它不会失败。

  1. Therefore for AID 100, BID should be either 1000 (from tableB) or any other new value that do not exist in TableB.BID irrespective of AID. 因此,对于AID 100,BID应该为1000(来自tableB)或TableB.BID中不存在的任何其他新值,而与AID无关。

A.AID = 101 BID=1001 but this BID value exist for B.AID = 107 so its a fail. A.AID = 101 BID = 1001,但是B.AID = 107存在此BID值,因此失败。 Expected result: 预期结果:

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

Thanks 谢谢

Just stumbled on this un-answered question while looking at something else. 看着其他东西时,偶然发现了这个悬而未决的问题。 These two queries in the same order seems to be a simple answer: 这两个查询以相同的顺序似乎是一个简单的答案:

  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

I'm using bigint as datatype because I simply don't know what king of type is there... 我使用bigint作为数据类型,因为我根本不知道那里有什么类型的国王...
This should help anyway: 无论如何,这应该有所帮助:

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