SQL多表关联:根据关联表合同条件匹配对应价格列取值
SQL实现方案
你当前的合同价格宽表结构下,直接使用CASE表达式做列值动态匹配即可,固定4个合同列的场景下该写法性能稳定、可维护性强,不需要使用动态SQL。
你原有基础SQL存在SELECT子句末尾多余逗号的语法问题,修正后补充价格匹配逻辑的完整代码如下:
SELECT [Sales].[Customer ID], [Sales].[Item ID], [Customers].[Contract Number] AS Contract, CASE [Customers].[Contract Number] WHEN 'Contract 1' THEN [Contracts].[Contract 1] WHEN 'Contract 2' THEN [Contracts].[Contract 2] WHEN 'Contract 3' THEN [Contracts].[Contract 3] WHEN 'Contract 4' THEN [Contracts].[Contract 4] END AS Price FROM [Sales] INNER JOIN [Customers] ON [Sales].[Customer ID] = [Customers].[Customer ID] INNER JOIN [Contracts] ON [Sales].[Item ID] = [Contracts].[Item ID];
逻辑说明
- 表关联逻辑完全沿用你已验证通过的内连接规则,不需要调整JOIN部分
- CASE分支会根据关联得到的客户所属合同编号,自动读取Contracts表中同名列的单价,不存在硬编码固定合同的问题
- 如果后续新增合同类型,只需要在CASE语句中追加对应WHEN分支即可
- 若存在客户关联的合同编号不在1-4范围内的异常数据,Price字段会默认返回NULL,可根据业务需求在CASE末尾追加ELSE分支做兜底,例如
ELSE 0标记异常、ELSE [Contracts].[Contract 1]设置默认定价
如果你使用的是Microsoft Access数据库(从方括号转义写法判断有这个可能性),Access不支持标准SQL的CASE语法,可以替换为SWITCH函数实现相同逻辑:
SWITCH( [Customers].[Contract Number] = 'Contract 1', [Contracts].[Contract 1], [Customers].[Contract Number] = 'Contract 2', [Contracts].[Contract 2], [Customers].[Contract Number] = 'Contract 3', [Contracts].[Contract 3], [Customers].[Contract Number] = 'Contract 4', [Contracts].[Contract 4] ) AS Price
示例数据匹配结果
按照你给出的测试数据,最终输出的4条销售记录匹配结果如下:
| Customer ID | Item ID | Contract | Price |
|---|---|---|---|
| Customer 1 | Item 1 | Contract 1 | Item 1在Contract1下的定价 |
| Customer 2 | Item 2 | Contract 3 | Item 2在Contract3下的定价 |
| Customer 3 | Item 1 | Contract 4 | Item 1在Contract4下的定价 |
| Customer 2 | Item 3 | Contract 3 | Item 3在Contract3下的定价 |
内容的提问来源于stack exchange,提问作者alandi35
相关产品推荐
相关产品推荐

