如何通过两个外键关联主表与另一张表实现SQL JOIN查询?
问题描述
我有两张表结构如下:
TABLE1(主表)
| ITEM_ID (PK) | ITEM_NAME | ITEM_PRICE |
|---|---|---|
| 1 | 橙子 | 123 |
| 2 | 苹果 | 321 |
| 3 | 香蕉 | 131 |
| 4 | 甜瓜 | 312 |
TABLE2
| CART_ID (PK) | CART_NAME | ITEM1_FK (FK1) | ITEM2_FK (FK2) |
|---|---|---|---|
| 11 | 购物车11 | 1 | 3 |
| 16 | 购物车16 | 2 | 2 |
| 85 | 购物车85 | 3 | 4 |
| 96 | 购物车96 | 4 | 1 |
TABLE2的两个外键ITEM1_FK、ITEM2_FK均指向TABLE1的主键ITEM_ID。我需要编写一条SELECT语句,关联两张表得到如下格式的结果:
期望结果
| CART_ID (PK) | CART_NAME | ITEM1_NAME | ITEM1_PRICE | ITEM2_NAME | ITEM2_PRICE |
|---|---|---|---|---|---|
| 11 | 购物车11 | 橙子 | 123 | 香蕉 | 131 |
我尝试用INNER JOIN关联两个外键,但总是遇到列名歧义错误,或者查询出的ITEM_NAME和ITEM_PRICE字段值完全相同。
解决方案
你需要两次关联TABLE1,并给每次关联的TABLE1设置不同的别名,同时给查询的字段指定别名,避免列名冲突。
正确的SQL语句如下:
SELECT t2.CART_ID, t2.CART_NAME, t1a.ITEM_NAME AS ITEM1_NAME, t1a.ITEM_PRICE AS ITEM1_PRICE, t1b.ITEM_NAME AS ITEM2_NAME, t1b.ITEM_PRICE AS ITEM2_PRICE FROM TABLE2 t2 INNER JOIN TABLE1 t1a ON t2.ITEM1_FK = t1a.ITEM_ID INNER JOIN TABLE1 t1b ON t2.ITEM2_FK = t1b.ITEM_ID -- 如需筛选特定购物车,可添加WHERE条件,比如只查购物车11 WHERE t2.CART_ID = 11;
关键点说明:
- 给TABLE1设置两个不同的别名
t1a和t1b,分别对应ITEM1_FK和ITEM2_FK的关联,这样就能区分两个关联的表数据。 - 给查询的
ITEM_NAME和ITEM_PRICE字段设置别名(AS ITEM1_NAME、AS ITEM2_PRICE等),确保结果列名符合需求,同时避免因为两个TABLE1有相同列名导致的歧义。 - 如果不需要筛选特定购物车,去掉最后的
WHERE条件即可得到所有购物车的关联结果。
内容的提问来源于stack exchange,提问作者Victor314
相关产品推荐
相关产品推荐

