Sql Server 2008和使用不同行数计算不同表中的行
你好。有人知道如何从不同的表中提取具有不同行数的数据吗 我从3个表中调用,其中一个表中的每个对应ID有多行。我需要选择每个ID的前6行,但我要加入的表有多个具有相同ID的行。我需要这些排。所以我需要列出前6行,但实际上可能不止6行。我的示例代码如下。我将此发送到VB和 它希望看到6批数据,但每批数据的行数不同。这是我的程序谢谢 注意**我遇到的问题是,当我运行这个队列时,它会给我6行,但如果RPG的配置文件ID有3行,那么我将得到6行,但有2个配置文件ID。我需要限制PK_RoasterQueueSequenceID具有6个不同ID的行或其他内容,但每个行可能不止一行。所以有超过6行,但按日期排序限制为6个ID…如果这有意义的话 注*这就像我想要从表中复制,但我不想让它们计入我的行数Sql Server 2008和使用不同行数计算不同表中的行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,你好。有人知道如何从不同的表中提取具有不同行数的数据吗 我从3个表中调用,其中一个表中的每个对应ID有多行。我需要选择每个ID的前6行,但我要加入的表有多个具有相同ID的行。我需要这些排。所以我需要列出前6行,但实际上可能不止6行。我的示例代码如下。我将此发送到VB和 它希望看到6批数据,但每批数据的行数不同。这是我的程序谢谢 注意**我遇到的问题是,当我运行这个队列时,它会给我6行,但如果RPG的配置文件ID有3行,那么我将得到6行,但有2个配置文件ID。我需要限制PK_RoasterQueu
USE [Product];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER PROCEDURE [Controls].[spTestGETBatchToPLC]
@SuperSackID INT OUTPUT, @POINTER1 INT
AS
SET NOCOUNT OFF;
DECLARE @PublishedStartDateTime AS SMALLDATETIME,
@Fk_RoasterQueueSequenceID AS INT,
@Pk_RoasterQueueSequenceID AS INT,
@RETURN AS INT;
IF @POINTER1 = 1
BEGIN
SELECT TOP 6 PK_RoasterQueueSequenceID,
RoasterNumber,
RoastProfile,
RoastDescription,
ChargeWeight
FROM wip.RoasterQueueSequence AS TRQS
INNER JOIN
wip.schedule AS s
ON s.fk_roasterqueuesequenceid = TRQS.PK_RoasterQueueSequenceID
-- inner join Specification.RoastProfileGreenBeanComponents RPG on (****This is where there my or maynot be more than one row with the same RoastProfileID) RPG.PK_RoastProfileID = trqs.RoastProfile
WHERE Trqs.Status = 'Queued'
AND Trqs.PK_RoasterQueueSequenceID = s.FK_RoasterQueueSequenceID
AND Trqs.RoasterNumber = 6
ORDER BY s.publishedstartdatetime ASC;
SELECT PublishedStartDateTime,
FK_RoasterQueueSequenceID,
wip.RoasterQueueSequence.PK_RoasterQueueSequenceID,
wip.RoasterQueueSequence.RoasterNumber,
wip.RoasterQueueSequence.RoastProfile,
wip.RoasterQueueSequence.RoastDescription,
wip.RoasterQueueSequence.ChargeWeight,
Specification.RoastProfileGreenBeanComponents.GreenBeanPercentOfCharge,
Specification.RoastProfileGreenBeanComponents.partno,
Specification.RoastProfileGreenBeanComponents.PK_RoastProfileID
FROM wip.Schedule, wip.RoasterQueueSequence, Specification.RoastProfileGreenBeanComponents
WHERE wip.RoasterQueueSequence.Status = 'Queued'
AND wip.roasterqueuesequence.RoastProfile = specification.RoastProfileGreenBeanComponents.PK_RoastProfileID
AND wip.RoasterQueueSequence.PK_RoasterQueueSequenceID = wip.Schedule.FK_RoasterQueueSequenceID
AND wip.RoasterQueueSequence.RoasterNumber = 6
ORDER BY PublishedStartDateTime;
SELECT @RETURN = @@rowcount
FROM WIP.RoasterQueueSequence;
END
一种方法是使用CTE和行数函数。基本方法是对FK表中的每条记录进行编号,即在主键上对一对多关系商店中的多条记录进行编号,然后删除每条记录,在本例中,编号高于阈值7。您还可以使用GROUP BY来确定要包括哪些PK记录。例如,假设我们正在处理订单和订单项,您的查询将如下所示:
;WITH myCTE AS (
SELECT
OrderDetailID,
OrderID,
ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY OrderDetailID)
as [OrderItemCount]
FROM OrderDetails
)
SELECT *
FROM myCTE
WHERE
--Get up to 7 details
OrderItemCount < 8
--Get up to 6 orders
AND OrderID IN (
SELECT TOP 6 OrderID FROM myCTE GROUP BY OrderID ORDER BY OrderID DESC
)
ORDER BY
--Most recent orders first
OrderID DESC
一种方法是使用CTE和行数函数。基本方法是对FK表中的每条记录进行编号,即在主键上对一对多关系商店中的多条记录进行编号,然后删除每条记录,在本例中,编号高于阈值7。您还可以使用GROUP BY来确定要包括哪些PK记录。例如,假设我们正在处理订单和订单项,您的查询将如下所示:
;WITH myCTE AS (
SELECT
OrderDetailID,
OrderID,
ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY OrderDetailID)
as [OrderItemCount]
FROM OrderDetails
)
SELECT *
FROM myCTE
WHERE
--Get up to 7 details
OrderItemCount < 8
--Get up to 6 orders
AND OrderID IN (
SELECT TOP 6 OrderID FROM myCTE GROUP BY OrderID ORDER BY OrderID DESC
)
ORDER BY
--Most recent orders first
OrderID DESC
我认为您只需要使用子查询从RoasterQueueSequence中获取前6条记录,并将结果连接到其他表
select x.*,...
from
(SELECT TOP 6 PK_RoasterQueueSequenceID,
RoasterNumber,
RoastProfile,
RoastDescription,
ChargeWeight
FROM wip.RoasterQueueSequence AS TRQS
INNER JOIN
wip.schedule AS s
ON s.fk_roasterqueuesequenceid = TRQS.PK_RoasterQueueSequenceID
WHERE Trqs.Status = 'Queued'
AND Trqs.PK_RoasterQueueSequenceID = s.FK_RoasterQueueSequenceID
AND Trqs.RoasterNumber = 6
) as x
inner join ...
我认为您只需要使用子查询从RoasterQueueSequence中获取前6条记录,并将结果连接到其他表
select x.*,...
from
(SELECT TOP 6 PK_RoasterQueueSequenceID,
RoasterNumber,
RoastProfile,
RoastDescription,
ChargeWeight
FROM wip.RoasterQueueSequence AS TRQS
INNER JOIN
wip.schedule AS s
ON s.fk_roasterqueuesequenceid = TRQS.PK_RoasterQueueSequenceID
WHERE Trqs.Status = 'Queued'
AND Trqs.PK_RoasterQueueSequenceID = s.FK_RoasterQueueSequenceID
AND Trqs.RoasterNumber = 6
) as x
inner join ...
您实际使用的数据库是什么?对于第一个select,您是否希望返回每个RoasterQueueSequence记录的前6个计划记录?此查询可以返回的最大记录数是多少?36 6*6?6*7,以便规格表可能具有相同的配置文件ID 7不同的时间7不同的零件号和收费百分比。@ENGR024请参阅下面我的答案。今晚晚些时候,我将尝试使用您的样本数据来整理一些内容。如果您设置了一个SQLFIDLE,这也会很有帮助。这将非常有帮助。我将不胜感激。我正在尝试使用您提供给我的以下示例。我只是有点卡住了,因为我在CTE中包含了3个表,而且出于某种原因SQL不喜欢我调用过程的方式。感谢您的时间。您实际使用的数据库是什么?对于第一个选择,您是否希望返回每个RoasterQueueSequence记录的前6个计划记录?此查询可以返回的最大记录数是多少?36 6*6?6*7,以便规格表可能具有相同的配置文件ID 7不同的时间7不同的零件号和收费百分比。@ENGR024请参阅下面我的答案。今晚晚些时候,我将尝试使用您的样本数据来整理一些内容。如果您设置了一个SQLFIDLE,这也会很有帮助。这将非常有帮助。我将不胜感激。我正在尝试使用您提供给我的以下示例。我只是有点卡住了,因为我在CTE中包含了3个表,而且出于某种原因SQL不喜欢我调用过程的方式。谢谢你抽出时间