SQL Server中如何通过中间表关联两个外键与同基表查询数据?
关联多账户表时名称字段重复的问题解决
表结构与需求
现有表结构
- tbl_CostType(成本核算表)
| id | DebitAccountId | CreditAccountId |
|---|---|---|
| 1 | 20 | 22 |
- tbl_Accounts(账户表)
| id | joinAccountId |
|---|---|
| 20 | j1 |
| 22 | j2 |
- tbl_JoinAccounts(关联账户表)
| id | Name |
|---|---|
| j1 | David |
| j2 | Robert |
查询需求
需要得到包含借贷方账户ID及对应名称的结果:
| debitAccountId | debitName | creditAccountId | creditName |
|---|---|---|---|
| 20 | David | 22 | Robert |
问题分析
你当前的查询只关联了一次tbl_Accounts和tbl_JoinAccounts,且仅关联了贷方账户(CreditAccountId),导致debitName和creditName都取的是同一条关联账户的名称,所以结果重复。
解决方法
需要分别对借方、贷方账户各做一次关联,并用表别名区分不同的关联实例:
SELECT ct.DebitAccountId, dj.Name AS debitName, ct.CreditAccountId, cj.Name AS creditName FROM tbl_CostType ct -- 关联借方账户对应的关联账户名称 INNER JOIN tbl_Accounts da ON ct.DebitAccountId = da.id INNER JOIN tbl_JoinAccounts dj ON da.joinAccountId = dj.id -- 关联贷方账户对应的关联账户名称 INNER JOIN tbl_Accounts ca ON ct.CreditAccountId = ca.id INNER JOIN tbl_JoinAccounts cj ON ca.joinAccountId = cj.id
说明
- 给
tbl_CostType取别名ct,简化SQL写法 - 借方账户关联:
tbl_Accounts取别名da(debit account),对应关联的tbl_JoinAccounts取别名dj(debit join) - 贷方账户关联:
tbl_Accounts取别名ca(credit account),对应关联的tbl_JoinAccounts取别名cj(credit join) - 通过两次独立的关联,分别获取借贷方对应的账户名称,避免字段值重复
内容的提问来源于stack exchange,提问作者aram
相关产品推荐
相关产品推荐

