我有一个复杂的SQL查询,我很难解决.我可以用C#来做这件事,但我会从数据库中带回大量数据(800K以上的记录).因此,重要的是在数据库中解决这个问题,只返回满足条件的最终记录.希望我能有效地沟通需求是什么.

为了简单起见,我在混合列表中有几个缩写.表之间的关系应该非常明显.

Asset (
    AssetId INT IDENTITY NOT NULL,
    SerialNumber NVARCHAR(20) NOT NULL,
    Description NVARCHAR(100) NOT NULL
)

AssetDealer (
    AssetDealerId INT IDENTITY NOT NULL,
    AssetId INT NOT NULL,
    DealerNumber NVARCHAR(15) NOT NULL,
    RelationshipTypeId INT NOT NULL
)

RelationshipType (
    RelationshipTypeId INT IDENTITY NOT NULL,
    Description NVARCHAR(20) NOT NULL,
    PriorityRank INT NOT NULL
)

交易商A可能已经将assets资源 出售给了消费者.交易商B可能已经为消费者安装了assets资源 .经销商C可以与消费者签订服务合同来执行维护.即纯销售商、独立安装商和纯服务商.

关系类型表的优先级列定义了优先顺序.较低的优先级实际上是较高的优先级(想想第一名、第二名、第三名).这个优先顺序是服务、安装、销售,或者本质上,谁是最后为消费者提供服务的人.

查询需要返回与特定交易商关联的assets资源 列表.这里是棘手的部分.如果assets资源 123遵循上面的场景,即每个阶段(销售、安装、服务)都有一个单独的交易商,则不能将assets资源 123包括在交易商A或B中,只能将其包括在交易商C中,因为他们是服务交易商,他们拥有最高的优先级.

然而,如果assets资源 123没有与交易商的服务协议(只有销售和安装经销商与该assets资源 相关联),则assets资源 123被包括在交易商B中,但不包括在交易商A中.类似地,如果assets资源 123尚未安装,则只有到那时才会将其包括在交易商A中.

请记住,经销商A可以完成所有三个阶段,也可以只完成其中两个阶段(即销售+服务).在这种情况下,包括经销商A的assets资源 123,因为经销商A是维修经销商,因此比执行安装的经销商B具有更高的优先级.

总而言之,任何一项assets资源 只能出现在单个交易商的查询结果中.永远不应该出现两个交易商能够看到相同assets资源 的情况.本质上,找到与特定交易商关联的所有assets资源 ,然后删除另一交易商具有更高优先级关系的所有assets资源 .

我试过几种方法来解决这个问题,但一无所获.先谢谢你.

我有一个复杂的SQL情况,我很难解决.我可以用C#来做这件事,但我会从数据库中带回大量数据(800K以上的记录).因此,重要的是在数据库中解决这个问题,只返回满足条件的最终记录.

为了简单起见,我在混合列表中有几个缩写:

Asset (
    AssetId INT IDENTITY NOT NULL,
    SerialNumber NVARCHAR(20) NOT NULL,
    Description NVARCHAR(100) NOT NULL
)

AssetDealer (
    AssetDealerId INT IDENTITY NOT NULL,
    SerialNumber NVARCHAR(20) NOT NULL,
    DealerNumber NVARCHAR(15) NOT NULL,
    RelationshipTypeId INT NOT NULL
)

RelationshipType (
    RelationshipTypeId INT IDENTITY NOT NULL,
    Description NVARCHAR(20) NOT NULL,
    PriorityRank INT NOT NULL
)

交易商A可能已经将assets资源 出售给了消费者.交易商B可能已经为消费者安装了assets资源 .经销商C可以与消费者签订服务合同来执行维护.即纯销售商、独立安装商和纯服务商.

优先级列定义优先顺序.较低的优先级实际上是较高的优先级(想想第一名、第二名、第三名).优先顺序是服务、安装人员、销售.或者从本质上说,是谁最后为消费者提供了服务.

该查询将返回与特定交易商关联的assets资源 列表.这里是棘手的部分.如果assets资源 123遵循上面的场景,其中每个阶段(销售、安装、服务)都有一个单独的交易商,则对于交易商A或B,assets资源 123不会显示,而只会显示C,因为他们是服务交易商,他们具有最高的优先级.

然而,如果assets资源 123没有与经销商签订服务协议(仅限销售和安装),则assets资源 123将显示给经销商B,但不显示给交易商A.同样,如果assets资源 123尚未安装,则只有到那时才会显示给交易商A.请记住,交易商A可以完成所有三个阶段或三个阶段中的两个阶段(即销售+服务).

总而言之,任何一项assets资源 都将出现在仅针对单个交易商的查询结果中.因此,找到与特定交易商关联的所有assets资源 ,然后删除另一交易商具有更高优先级关系的任何assets资源 .

AssetId SerialNumber Description
1 123 Widget
2 234 Spinner
3 345 Poster
4 456 Toy
AssetDealerId AssetId DealerNumber RelationshipTypeId
1 1 A 3
2 1 B 2
3 1 C 1
4 2 A 1
5 2 A 2
6 2 A 3
7 3 A 3
8 3 B 2
9 3 A 1
10 4 A 3
RelationshipTypeId Description PriorityRank
1 Service Dealer 1
2 Installer 2
3 Sales Dealer 3

查询经销商A的结果

AssetId SerialNumber Description
2 234 Spinner
3 345 Poster
4 456 Toy

经销商B的查询结果=无assets资源

查询经销商C的结果

AssetId SerialNumber Description
1 123 Widget

推荐答案

嗯,我写的查询在经过一些调整后对我来说运行得很好:

select *
    into #asset
    from (
        VALUES  (1, 123, N'Widget')
        ,   (2, 234, N'Spinner')
        ,   (3, 345, N'Poster')
        ,   (4, 456, N'Toy')
    ) t (AssetId,SerialNumber,Description)
    
    select *
    into #assetDealer
    from (
        VALUES  (1, 1, N'A', 3)
        ,   (2, 1, N'B', 2)
        ,   (3, 1, N'C', 1)
        ,   (4, 2, N'A', 1)
        ,   (5, 2, N'A', 2)
        ,   (6, 2, N'A', 3)
        ,   (7, 3, N'A', 3)
        ,   (8, 3, N'B', 2)
        ,   (9, 3, N'A', 1)
        ,   (10, 4, N'A', 3)
    ) t (AssetDealerId,AssetId,DealerNumber,RelationshipTypeId)
    
    select *
    into #relationshipType
    from (
        VALUES  (1, N'Service Dealer', 1)
        ,   (2, N'Installer', 2)
        ,   (3, N'Sales Dealer', 3)
    ) t (RelationshipTypeId,Description,PriorityRank)
    
    
    select * from (
        select ass.*, d.DealerNumber, rr.Description AS relationship
        ,   row_number() over(partition by ass.assetID ORDER BY PriorityRank ) AS sort 
        from #Asset ass
        inner join #AssetDealer d
            ON d.AssetId = ass.AssetId
        inner join #RelationshipType rr ON rr.RelationshipTypeId = d.RelationshipTypeId
    ) x 
    where x.sort = 1 
    and DealerNumber IN ('A', 'B', 'C') -- here you set which dealer you're looking for

我首先准备正确的assets资源 覆盖,只 Select 每个assets资源 最优先的交易商.然后我会判断我要找的是哪一家经销商.

Csharp相关问答推荐

使用GeneratedComInterfaceProperty的.NET 8 COM类对于VB 6/SYS或ALEViewer不可见

子组件:如何根据另一个组件的状态启用输入

Regex在c#中完全匹配

Unity如何在PlayerPrefs中保存数据?

需要深入了解NpgSQL DateTimeOffset处理

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

在C#中,DirectoryEntry返回空AuditRules集合,即使审计规则确实存在

BlockingCollection T引发意外InvalidOperationException

DbContext-传递自定义配置选项

如何向事件添加成员

为什么@rendermode Interactive Auto不能在.NET 8.0 Blazor中运行?

为什么方法的值在SELECT方法中不会更改?

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

序列化过程中的死循环

Foreach非常慢的C#

如何将 colored颜色 转换为KnownColor名称?

并发表更新.EF核心交易

Azure队列触发器未使用隔离的工作进程执行

C#If条件格式

将带有嵌套If-Else的Foreach循环转换为Linq表达式