[英]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.