我有两个表:orders
和 customer
orders
:
+--------+-----------+------------+-------------+-------------+
| ord_no | purch_amt | ord_date | customer_id | salesman_id |
+--------+-----------+------------+-------------+-------------+
| 70009 | 270.65 | 2012-09-10 | 3001 | 5005 |
| 70002 | 65.26 | 2012-10-05 | 3002 | 5001 |
| 70004 | 110.50 | 2012-08-17 | 3009 | 5003 |
| 70005 | 2400.60 | 2012-07-27 | 3007 | 5001 |
| 70008 | 5760.00 | 2012-09-10 | 3002 | 5001 |
| 70010 | 1983.43 | 2012-10-10 | 3004 | 5006 |
| 70003 | 2480.40 | 2012-10-10 | 3009 | 5003 |
| 70011 | 75.29 | 2012-08-17 | 3003 | 5007 |
| 70013 | 3045.60 | 2012-04-25 | 3002 | 5001 |
| 70001 | 150.50 | 2012-10-05 | 3005 | 5002 |
| 70007 | 948.50 | 2012-09-10 | 3005 | 5002 |
| 70012 | 250.45 | 2012-06-27 | 3008 | 5002 |
+--------+-----------+------------+-------------+-------------+
customer:
+-------------+----------------+------------+-------+-------------+
| customer_id | cust_name | city | grade | salesman_id |
+-------------+----------------+------------+-------+-------------+
| 3002 | Nick Rimando | New York | 100 | 5001 |
| 3007 | Brad Davis | New York | 200 | 5001 |
| 3005 | Graham Zusi | California | 200 | 5002 |
| 3008 | Julian Green | London | 300 | 5002 |
| 3004 | Fabian Johnson | Paris | 300 | 5006 |
| 3009 | Geoff Cameron | Berlin | 100 | 5003 |
| 3003 | Jozy Altidor | Moscow | 200 | 5007 |
| 3001 | Brad Guzan | London | | 5005 |
+-------------+----------------+------------+-------+-------------+
我试图解决的问题是
我的查询是
SELECT ord_no, purch_amt, cust_name, city
FROM orders o
JOIN customer c
ON o.customer_id = c.customer_id
WHERE purch_amt BETWEEN 500 AND 2000
上述查询根据 this 链接给出了正确答案。但我不明白要加入哪个列。
我已经在
o.customer_id = c.customer_id
上加入了表,但是如果我在 salesman_id
上加入两个表呢?为什么加入
customer_id
是正确的,而 salesman_id
是错误的。我想了解一般情况下,当表中有多个公共(public)列发生连接时,如何决定应该发生哪个连接的列(在这种情况下是 customer_id
和 salesman_id
) 最佳答案
要回答的问题:customer.salesman_id
代表什么?orders.salesman_id
显然告诉我们哪个销售员卖了这些东西,而 orders.customer_id
告诉我们谁买了它。所以我们通过 customer_id
加入以获得订单的客户名称。customer.salesman_id
可能意味着类似于通常向客户销售的销售员,这与任务完全无关。
但是,也可能是 customer_id
仅与 salesman_id
结合使用时才有效。所以销售员 #1 有一个客户 #1,但销售员 #2 也有(另一个)客户 #1。那将是复合键,即 salesman_id
+ customer_id
将是客户的主键,自然是订单的外键。那么你必须加入两个列。 (但是,将这些列称为 ID 将是一个坏主意。salesman_number
+ customer_number
将是更好的选择,以表明它们不是表的单个 ID。)
所以你看,这取决于 customer.salesman_id
的含义。为了编写查询,您必须了解您的数据模型。正如您所说您的解决方案是正确的,customer.salesman_id
显然具有与给定任务无关的含义。
关于sql - 我如何决定加入表格的键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54414786/