You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 IDItem IDContractPrice
Customer 1Item 1Contract 1Item 1在Contract1下的定价
Customer 2Item 2Contract 3Item 2在Contract3下的定价
Customer 3Item 1Contract 4Item 1在Contract4下的定价
Customer 2Item 3Contract 3Item 3在Contract3下的定价

内容的提问来源于stack exchange,提问作者alandi35

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:36:28