我有一个复杂的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 |