当前位置: 首页 > 知识库问答 >
问题:

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

谭锐藻
2023-03-14

我正在使用“插入到选择”将记录添加到我的表“SampleTestLimits”中,但它也有一个从同一个表读取的子查询来为我执行计数。

我认为子查询没有看到我的“插入到选择”添加的早期记录。Oracle和SQL Server也是如此。SQL Server的代码如下所示(我的子查询以“选择合并…”开头)。

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

如果有人能告诉我我在做什么是不,我会很感激的。

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

共有1个答案

费德宇
2023-03-14

假设我正确地理解了你的逻辑(即,您希望下一个限制数在添加的每一行时增加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);

我必须猜测PartitionBy子句需要包含什么-根据您的需求进行必要的调整。

 类似资料:
  • 问题内容: 显然,以下是不正确的。 我得到的价值: SQL查询: MySQL说: 1093-您无法在FROM子句中指定目标表’aTable’用于更新 因此,我试图制作一个位图表,每一行对应一个位,并具有一个“ map”值。 要插入表中,我不想执行两个查询,而是想执行一个查询。我应该怎么做? 没有人对此发表评论,但是由于我正在尝试制作位图,因此应该是* 2而不是^ 2,是我的错误,请注意,这就是为什

  • 使用本机SQL我可以选择、修改和将记录插入到这样的表中: 由于ID字段是主键,这一点特别有用。 我想用JOOQ在Java中做同样的事情,但我不知道如何提供修改后的字段值。 这可能吗?如果可能,怎么可能?

  • 问题内容: 这是一个有点奇怪的请求,但我正在寻找一种方法来将列表写入文件,然后再读回去。 我没有办法重新制作列表,以使它们如下面的示例所示正确地形成/格式化。 我的列表具有如下数据: 问题答案: 如果您不需要它是人类可读/可编辑的,则最简单的解决方案是使用。 来写: 读书: 如果您 确实 需要使它们易于阅读,则我们需要更多信息。 如果保证是没有嵌入换行符的字符串列表,则只需每行写一个: 如果它们是

  • 我试图在postgres表的numeric datatype列中插入一个日期值 在上面的查询中,col1是numeric类型。 我还可以使用value()子句插入一些值,使用select语句插入一些值吗?例如: 在上表中:1。col1即将到来序列2。col2和col3来自两个表的连接,即表B和表C 3。col4和col5是硬编码值 如何在一个查询中实现这一点? 通过两个表的连接进行插入,可按如下方

  • 我刚开始冬眠。我有两张桌子,有一对多的关系。有两个表格: 这是一个父类,它与图像表有一对多关系 现在我想使用父类的id(即:pashminaId)从类中选择一个 如: 选择IMAGE_NAMETBL_IMAGEPASHMINA_ID='some_digit'; 我怎么能在图像类中传递pashminaId,因为没有它只有一个父类的对象创建。 那么,我如何在Hibernate中实现这一点? 谢谢!希望

  • 问题内容: 我是SQL的初学者,对Transact-SQL不太了解。 我意识到这是一个新手问题,但是我正在寻找一个简单的解决方案。 我有一个带有一些列()的表。 主表 我想从该表中选择数据并插入到其他两个表中。 第一桌 是来自的前三个字符的组合 第一个表中的数据按的前三个字符和客户代码分组 第二张桌子 那么,如何通过使用SQL选择主表的行来插入第一张表和第二张表呢? 感谢您的所有答复。 问题答案: