我如何决定要加入表的键

时间:2019-01-29 06:06:11

标签: sql sql-server join

我有两个表:orderscustomer

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})中,如何决定应在哪些列上进行连接})

2 个答案:

答案 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 (它们在每个表中的唯一标识符)进行链接。