我有两个表:orderscustomerorders :

+--------+-----------+------------+-------------+-------------+
| 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_idsalesman_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/

10-13 07:53