【问题标题】:What the real different between those two method to join tables in SQL这两种在 SQL 中连接表的方法之间的真正区别是什么
【发布时间】:2018-05-16 19:57:35
【问题描述】:

我看到人们在 SQL 中使用两种不同的方法来加入表;例如,我有两个表:

    Table A                                   Table B       
DeliveryDate    EMP     Hours          Date      EMP    Route
 5/14/2017     611300    1            5/14/2017 611300  11101
 5/14/2017     611301    3            5/14/2017 611301  11102
 5/13/2017     611300    4            5/13/2017 611300  11101
 5/13/2017     611301    5            5/13/2017 611301  11102
                                      5/13/2017 611301  11103

对于这两个表,EMP(employee id) 是字符串,小时数是数字,基本上是想将拖车表连接在一起,以获得员工工作的小时数和他工作的路线数。我看到人们使用两种不同的代码来达到目的,但是这两种方法之间的真正区别是什么?哪一个更好?代码如下:

代码 1:

SELECT C.DELIVERYDATE,C.EMP,C.HOURS,D.ROUTES
FROM
(
SELECT 
A.DeliveryDate, A.EMP, A.Hours
FROM 
A
) C,
(
SELECT
B.DATE,B.EMP,COUNT(B.ROUTE) AS ROUTES
FROM 
B
group BY B.DATE,B.EMP
)D
WHERE C.DeliveryDate=D.DATE
 AND    C.EMP=D.EMP

代码 2:

SELECT C.DELIVERYDATE,C.EMP,C.HOURS,D.ROUTES
FROM
(
SELECT 
A.DeliveryDate&A.EMP AS DATEEMP, A.DELIVERYDATE,A.EMP,A.Hours
FROM 
A
) C,
(
SELECT
B.DATE&B.EMP AS DATEEMP,B.DATE,B.EMP,COUNT(B.ROUTE) AS ROUTES
FROM 
B
group BY B.DATE,B.EMP
)D
WHERE C.DATEEMP=D.DATEEMP

非常感谢

【问题讨论】:

标签: sql


【解决方案1】:

正确的连接语法是这样的:

Select * from table1 a join table2 b on a.fkey=b.pkey where [add conditions here]

【讨论】:

  • 你好丹尼尔。问题是那些表中有PK和FK,如您所见,我认为我应该同时加入日期和日期,员工ID和员工ID。
  • 是的,我只是向您展示了一个语法示例 - 在您的情况下,您肯定希望按照您的建议将 date 与 date 以及 employeeid 与 employeeid 结合起来
【解决方案2】:

首先,从不from 子句中使用逗号。 始终使用正确、明确、标准的join 语法。

一种正确的方法是在加入之前进行聚合,例如:

SELECT DELIVERYDATE, EMP, C.HOURS, D.ROUTES
FROM (SELECT A.DeliveryDate, A.EMP, A.Hours
      FROM A
     ) A FULL JOIN
     (SELECT B.DATE, B.EMP, COUNT(B.ROUTE) AS ROUTES
      FROM B
      GROUP BY B.DATE, B.EMP
     ) D
     USING (DeliveryDate, Emp);

【讨论】:

  • 谢谢。我是 SQL 新手,你是对的,我应该在加入之前先计算路线,因为有些人在多条路线上工作,但几个小时内只有 1 条记录;如果我先加入,我将有两条路线共享相同的总小时数,这是不对的。在您的查询中,如果我想在 D 上执行 C 左连接,我应该更改什么?永远不要使用你建议的 using 函数。
  • @Frank 。 . . FULL JOIN 保留任一表中的所有日期/员工组合。 INNER JOIN 保留两个表中的组合。 LEFT JOIN 将组合保留在第一个表中。
猜你喜欢
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 2019-03-31
相关资源
最近更新 更多