Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server根据表B上部分匹配字符串的select计数更新表A_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL Server根据表B上部分匹配字符串的select计数更新表A

Sql server 2008 SQL Server根据表B上部分匹配字符串的select计数更新表A,sql-server-2008,Sql Server 2008,非常新的SQL Server,我使用的是SQL Server 2008。我有两张桌子,A桌和B桌 我想用表B中匹配字符串的计数来更新表A。我希望它能够在表a中的所有记录的过程中,在表B中插入/更新记录时执行此操作 TABLE A: **PO**, Count, Closed Table B: **LD** 24A, 0, 0, 24A-1 25A, 0, 0,

非常新的SQL Server,我使用的是SQL Server 2008。我有两张桌子,A桌和B桌

我想用表B中匹配字符串的计数来更新表A。我希望它能够在表a中的所有记录的过程中,在表B中插入/更新记录时执行此操作

TABLE A: **PO**, Count, Closed         Table B: **LD**
            24A, 0,     0,                      24A-1
            25A, 0,     0,                      24A-2
            26A, 0,     0,                      25A-3
                                                26A-1
                                                26A-2
我试过的代码:

 Declare @POTableA AS VARCHAR(15)
 SET @POTableA = '24A'
   Update TABLE A
   SET TableA.Count =(Select Count(*) AS 'Count_LD' FROM TABLE B 
   WHERE TableB.LD LIKE '%'+@POTableA+'-%') 
   FROM TABLE B WHERE TABLEA.PO LIKE '%'+@POTableA+'%'
当前结果:

TABLE A: **PO**, Count, Closed         Table B: **LD**
            24A, 2,     0,                      24A-1
            25A, 0,     0,                      24A-2
            26A, 0,     0,                      25A-3
                                                26A-1
                                                26A-2
预期结果:

TABLE A: **PO**, Count, Closed         Table B: **LD**
            24A, 2,     0,                      24A-1
            25A, 1,     0,                      24A-2
            26A, 2,     0,                      25A-3
                                                26A-1
                                                26A-2

虽然我不确定为什么需要将计数保存在表A中,但您可以在运行时确定此计数,这样就不必使用触发器等来维护冗余信息。但这里有一个使用表变量的演示,演示了如何使用聚合实现这样的更新,可能还有其他方法

DECLARE @A TABLE(PO VARCHAR(32), [count] INT);

DECLARE @B TABLE(LD VARCHAR(32));

INSERT @A VALUES
('24A',0), ('25A',0), ('26A',0);

INSERT @B VALUES
('24A-1'), ('24A-2'), ('25A-3'),
('26A-1'), ('26A-2');

UPDATE T
SET T.[count] = S.[count]
FROM @A AS T
INNER JOIN
(
 SELECT A.PO, [count] = COUNT(B.LD)
   FROM @A AS A INNER JOIN @B AS B
   ON B.LD LIKE A.PO + '%'
   GROUP BY A.PO
) AS S
ON T.PO = S.PO;

SELECT PO, [count] FROM @A;
结果:

PO     count
----   -----
24A    2
25A    1
26A    2
现在,如果您需要在触发器中执行此操作,它将类似于:

CREATE TRIGGER dbo.MaintainRedundantCount
ON dbo.TableB
FOR INSERT, UPDATE
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE T
   SET T.[count] = S.[count]
   FROM dbo.TableA AS T
   INNER JOIN
   (
     SELECT A.PO, [count] = COUNT(B.LD)
       FROM dbo.TableA AS A 
       INNER JOIN dbo.TableB AS B
       ON B.LD LIKE A.PO + '%'
       GROUP BY A.PO
   ) AS S
   ON T.PO = S.PO;
END
GO
您可能希望将其中一行修改为:

       ON B.LD LIKE A.PO + '-%'

但是,由于您在问题中只给出了三个样本值,并且它们的格式完全相同,因此很难判断您的真实数据集是什么样子。

因为我需要更新PO以在达到最大LD后关闭它。如果采购订单未关闭,个人可以创建任何唯一的LD。谢谢。您仍然可以强制执行此操作,而无需将计数存储在某个位置。虽然我不确定您为什么需要将计数存储在表A中,但您始终可以在运行时确定此计数如何在不声明值的情况下执行此操作。我想从表A中选择任何未关闭的采购订单,并获取B中与字符串部分匹配的数量。然后用计数更新A?这是用计数更新A,我不知道,但我的答案解决了-你试过了吗?。如果您需要在尝试向表B添加新LD时验证PO是否未关闭,您不能使用联接检查计数吗?当您可以从已经存在的数据中获取信息时,为什么计数必须独立存储?我的问题是,更新T set T.[count]=S.[count]以及作为B插入的联接是什么?我对语法和错误不太清楚。谢谢。@user1680975什么错误?如果我们不知道您键入了什么部分以及出现了什么错误,则很难回答。Msg 2级别15,靠近“.”的语法不正确。您指的是表A吗?我仍然看不到您的查询窗口中有什么导致该错误的内容。我不认为这正是我上面所说的。当设置更新时,我似乎误解了你设置t=什么?我有A桌和B桌