繁体   English   中英

如何从具有多个SET依赖项的MSSQL表中选择记录?

[英]How can I select records from MSSQL table with multiple SET dependencies?

我的表结构/数据是这个

Itemid    RechTyp PstNr  InvoicNr   

1          M       200   Null
2          B       200   84684
3          B       300   84684
4          B       400   84684
5          M       500   Null
6          B       500   84685
7          B       600   84685
8          B       700   84685 

列ItemID是唯一键。 PstNr列是ItemID 1和2的引用,而InvoiceNumber是ItemID 2,3&4的唯一引用。 第一个M和B记录由PstNr统一。

我需要一个可以选择这4条记录的查询。 请记住,该表包含超过10,000条带有这些记录集的记录。 我正在考虑使用cet&Partition函数,但仍在查询中。

我的预期结果是:请参见下表Table MyTransaction,其中的状态行针对每个select语句进行了更新,因此基于itemID的选择将不起作用。 因为我对如何插入数据没有任何保证。 ItemId 3可能位于最后一行。

RechTyp   PstNr    InvioceNr
M       200   Null
B       200   84684
B       300   84684
B       400   84684

这可能适用于较小的表,但较大的记录表中​​可能存在性能问题:

DECLARE @TEMP TABLE (Itemid INT, RechTyp NVARCHAR(1), PstNr INT, InvoicNr INT NULL)
INSERT INTO @TEMP VALUES
(1,'M',200,   Null),
(2,'B',200,   84684),
(3,'B',300,   84684),
(4,'B',400,   84684),
(5,'M',500,   Null),
(6,'B',500,   84685),
(7,'B',600,   84685),
(8,'B',700,   84685)

DECLARE @INVOICE INT = 84684

SELECT *
FROM @TEMP
WHERE InvoicNr = @INVOICE
OR PstNr IN (
            SELECT PstNr
            FROM @TEMP
            WHERE InvoicNr = @INVOICE)

输出:

Itemid  RechTyp PstNr   InvoicNr
1   M   200 NULL
2   B   200 84684
3   B   300 84684
4   B   400 84684

假设我理解这个问题,您想获取与特定发票编号关联的所有记录,问题是这些记录之一在InvoiceNr列中没有值,但是您可以使用PstNr列进行标识。

我认为这应该为您带来理想的结果:

;WITH CTE AS 
(
    SELECT RechTyp, PstNr, InvioceNr
    FROM Table
    WHERE InvioceNr = @InvioceNr
)

SELECT RechTyp, PstNr, InvioceNr
FROM CTE

UNION ALL

SELECT RechTyp, PstNr, InvioceNr
FROM Table
WHERE PstNr IN(SELECT PstNr FROM CTE)

ORDER BY PstNr, InvioceNr

这是对我有用的答案。 我不是工会的拥护者,加入他们会消耗更多的资源。

;With cte_get_invoice (ItemID ,RechTyp, InvoicNr, PstNr ,rownumber)
AS
(
SELECT ItemID ,RechTyp, InvoicNr, PstNr, row_number()over(partition by PstNr
                 ORDER BY RechTyp, InvoicNr, PstNr) 
                as rank from  TransactionTable
)

 select  RechTyp, InvoicNr, PstNr FROM TransactionTable
 where PstNr = (select top(1) PstNr from cte_get_invoice where rownumber  > 1 )
 or InvoicNr = (select top(1) InvoicNr from cte_get_invoice where rownumber  > 1 )

暂无
暂无

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

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