我有一个像这样的主表 -
Table(Feature, PrjctNo, Instance)
这里的每条记录都是独一无二的。说,
FTR1, PrjctA, Instance1
FTR1, PrjctB, Instance2
FTR2, PrjctA, Instance2
FTR2, PrjctB, Instance1
FTR3, PrjctA, Instance5
FTR4, PrjctA, Instance0
基本上,每个功能都可以映射到多个项目。每个项目都可以映射到多个功能,但每个功能的项目实例都是唯一的。
我所拥有的是一张包含主表中FTR No的子集的表。现在,我想从与这些功能相关联的主服务器中检索所有项目。
现在,由于每个项目都可以与多个其他功能相关联,因此我需要识别这些记录,以便项目的实例始终高于现有项目。
Ex:鉴于我有一个子集(FTR1,FTR2)
迭代1:
FTR1, PrjctA, Instance1
FTR1, PrjctB, Instance2
FTR2, PrjctA, Instance2
FTR2, PrjctB, Instance1
迭代2:检查是否有任何其他功能与上面提取的任何项目相关联。因此,在迭代2之后,结果集应如下所示:
FTR1, PrjctA, Instance1
FTR1, PrjctB, Instance2
FTR2, PrjctA, Instance2
FTR2, PrjctB, Instance1
FTR3, PrjctA, Instance5
我们不会添加PrjctA的Instance0记录。我们总是要获取更高的实例。
如何使用SQL Server完成此操作?
答案 0 :(得分:0)
下面的CTE之类的内容将起作用,假设您的所有“实例”列的格式都与“实例”完全相同,然后是数字。您的逻辑需要一个自然的实例列。
如果您的列格式是一致的,那么这与删除“Instance”前缀然后以数字方式排序以围绕后续实例强制执行业务规则一样简单。
如果格式不一致,那么您需要一种更精细的方式来比较实例。您可以使用REPLICATE和STUFF在比较不同长度或CTE的实例时填充必要的'0'值,以利用正则表达式匹配并更有效地执行。
这是CTE:
;WITH CTE AS (
SELECT
Feature,
PrjctNo,
Instance
FROM @Features
WHERE Feature IN ('FTR1', 'FTR2')
UNION ALL
SELECT
F.Feature,
F.PrjctNo,
F.Instance
FROM CTE
INNER JOIN @Features F
ON CTE.PrjctNo = F.PrjctNo
AND CTE.Feature <> F.Feature
WHERE CONVERT(INT, REPLACE(CTE.Instance, 'Instance', ''))
< CONVERT(INT, REPLACE(F.Instance, 'Instance', ''))
)
SELECT
Feature
FROM CTE
GROUP BY
Feature
OPTION (MAXRECURSION 0)
这样可以解决以下示例数据:
DECLARE @Features TABLE (
Feature VARCHAR(10),
PrjctNo VARCHAR(15),
Instance VARCHAR(15)
)
INSERT @Features VALUES
('FTR1', 'PrjctA', 'Instance1'),
('FTR1', 'PrjctB', 'Instance2'),
('FTR2', 'PrjctA', 'Instance2'),
('FTR2', 'PrjctB', 'Instance1'),
('FTR3', 'PrjctA', 'Instance5'),
('FTR4', 'PrjctA', 'Instance0')
以上示例输出您想要的结果:
Feature
----------
FTR1
FTR2
FTR3