繁体   English   中英

“插入选择”写入表,但包含从同一表读取的子查询

[英]“Insert Into Select” writing to table but contains sub-query reading from same table

我正在使用“插入选择”将记录添加到我的表“ SampleTestLimits”中,但是该记录还具有从同一表读取的子查询,可以为我执行计数。

我认为子查询没有看到我的“插入选择”添加的早期记录。 Oracle和SQL Server相同。 SQL Server的代码如下所示(我的子查询以“ SELECT COALESCE ...”开头)。

我有另一个在类似情况下也可以工作的存储过程。

如果有人能告诉我我在做什么,请多多关照。

ALTER PROCEDURE [dbo].[CreateSampleTestLimits]
@SampleCode as NVARCHAR(80),
@TestPosition as smallint,
@TestCode NVARCHAR(20),
@TestVersion smallint,
@EnterDate as integer,
@EnterTime as smallint,
@EnterUser as NVARCHAR(50)
AS
BEGIN
INSERT INTO SampleTestLimits
([AuditNumber]
,[LimitNumber]
,[ComponentRow]
,[ComponentColumn]
,[ComponentName]
,[TestPosition]
,[SampleCode]
,[AuditFlag]
,[LimitSource]
,[LimitType]
,[UpperLimitEntered]
,[UpperLimitValue]
,[LowerLimitEntered]
,[LowerLimitValue]
,[LimitTextColour]
,[LimitPattern]
,[LimitForeColour]
,[LimitBackColour]
,[CreatedDate]
,[CreatedTime]
,[CreatedUser]
,[LimitText]
,[FilterName]
,[deleted]
,IsRuleBased)
SELECT 1 --starting auditnumber
,(SELECT COALESCE(MAX(LimitNumber), 0) + 1 AS NextLimitNumber FROM SampleTestLimits WHERE SampleCode=@SampleCode AND TestPosition=@TestPosition AND ComponentRow=1 AND ComponentColumn=1 AND AuditFlag=0) -- TFS bug# 3952: Calculate next limit number.
,ComponentRow
,ComponentColumn
,(select ComponentName from TestComponents TC where TC.TestCode=@TestCode and TC.ComponentColumn=TestLimits.ComponentColumn and TC.ComponentRow = TestLimits.ComponentRow and TC.AuditNumber=TestLimits.AuditNumber)
,@TestPosition
,@SampleCode
,0 --auditflag
,1 --limitsource = test
,[LimitType]
,[UpperLimitEntered]
,[UpperLimitValue]
,[LowerLimitEntered]
,[LowerLimitValue]
,[LimitTextColour]
,[LimitPattern]
,[LimitForeColour]
,[LimitBackColour]
,@EnterDate
,@EnterTime
,@EnterUser
,[LimitText]
,[FilterName]
,0 --deleted
,0 --rule based
FROM TestLimits join Tests on Tests.TestCode=TestLimits.TestCode and Tests.AuditNumber= TestLimits.AuditNumber  WHERE Tests.TestCode=@TestCode and Tests.auditnumber=@TestVersion and ([TestLimits].FilterString is null or DATALENGTH([TestLimits].FilterString)=0)
END

假设我正确理解了您的逻辑(即您希望将nextlimitnumber对要添加的每一行增加1),在Oracle中,我将通过使用解析函数row_number()来计算要添加的数字先前的最大值,例如:

INSERT INTO sampletestlimits (auditnumber,
                              limitnumber,
                              componentrow,
                              componentcolumn,
                              componentname,
                              testposition,
                              samplecode,
                              auditflag,
                              limitsource,
                              limittype,
                              upperlimitentered,
                              upperlimitvalue,
                              lowerlimitentered,
                              lowerlimitvalue,
                              limittextcolour,
                              limitpattern,
                              limitforecolour,
                              limitbackcolour,
                              createddate,
                              createdtime,
                              createduser,
                              limittext,
                              filtername,
                              deleted,
                              isrulebased)
  SELECT 1, --starting auditnumber
         (SELECT COALESCE (MAX (limitnumber), 0) + 1 AS nextlimitnumber
          FROM   sampletestlimits
          WHERE      samplecode = p_samplecode
                 AND testposition = p_testposition
                 AND componentrow = 1
                 AND componentcolumn = 1
                 AND auditflag = 0)
           + row_number() over (partition by testposition, componentrow, componentcolumn, auditflag) as nextlimitnumber, -- TFS bug# 3952: Calculate next limit number.
         componentrow,
         componentcolumn,
         (SELECT componentname
          FROM   testcomponents tc
          WHERE      tc.testcode = p_testcode
                 AND tc.componentcolumn = testlimits.componentcolumn
                 AND tc.componentrow = testlimits.componentrow
                 AND tc.auditnumber = testlimits.auditnumber),
         p_testposition,
         p_samplecode,
         0, --auditflag
         1, --limitsource = test
         limittype,
         upperlimitentered,
         upperlimitvalue,
         lowerlimitentered,
         lowerlimitvalue,
         limittextcolour,
         limitpattern,
         limitforecolour,
         limitbackcolour,
         p_enterdate,
         p_entertime,
         p_enteruser,
         limittext,
         filtername,
         0, --deleted
         0  --rule based
  FROM   testlimits
         JOIN tests
           ON     tests.testcode = testlimits.testcode
              AND tests.auditnumber = testlimits.auditnumber
  WHERE      tests.testcode = p_testcode
         AND tests.auditnumber = p_testversion
         AND (   testlimits.filterstring IS NULL
              OR datalength (testlimits.filterstring) = 0);

我不得不猜测partition by子句需要包含什么-根据您的要求进行必要的调整。

暂无
暂无

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

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