我有两个表: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 |
+-------------+----------------+------------+-------+-------------+
我要解决的问题是
写一条SQL语句,列出订单金额在500到2000之间的订单的编号,购买金额,客户名称及其城市。
我对此的查询是
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
上却是错误的。我想了解一般,当表之间存在多个公共列(在这种情况下为customer_id
和{{1})中,如何决定应在哪些列上进行连接})
答案 0 :(得分:6)
要回答的问题: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
显然具有与给定任务无关的含义。
答案 1 :(得分:2)
您使用关系数据库,在该数据库中,订单与客户(下订单的客户)之间存在关联。与处理每个订单的推销员也有关系。根据需要的信息,您需要联接表,并且相关的详细信息通过它们的 key (它们在每个表中的唯一标识符)进行链接。