内部将 2 个表合二为一

Inner join 2 tables into one

我有2个table,想inner join变成一个table。我正在使用 Excel 进行查询,因此它的语法有限 (Jet Access)。 stack1stack2 table 是相同的,在两个不同的 Excel 工作表中。

table来自 Vertica(stack1stack2)和 SQL 服务器(overflow),然后我正在尝试内部查询合并 tables.

这是我尝试过的方法,我遇到了语法错误,不确定哪里出错了:

select *
from [stack1$], [stack2$]
INNER JOIN [overflow$]
ON [stack1$].[iddate] = [overflow$].[iddate]
AND [stack1$].[idbusiness] = [overflow$].[idbusiness]
AND [stack2$].[iddate] = [overflow$].[iddate]
AND [stack2$].[idbusiness] = [overflow$].[idbusiness]

如果我像这样只做一个 table,效果很好:

select *
from [stack1$]
INNER JOIN [overflow$]
ON [stack1$].[iddate] = [overflow$].[iddate]
AND [stack1$].[idbusiness] = [overflow$].[idbusiness]

示例数据:

溢出:

 +----------+------------+---------+
|  iddate  | idbusiness | otherid |
+----------+------------+---------+
| 20180209 |   95971462 |    5235 |
+----------+------------+---------+

堆栈 1:

+------------+-------+----------+
| idbusiness | value |  iddate  |
+------------+-------+----------+
|   95971462 |       | 20180209 |
|   95971462 |       | 20180209 |
|   95971462 |       | 20180209 |
|   95971462 |       | 20180209 |
|   95971462 |       | 20180209 |
|   95971462 |       | 20180209 |
|   95971462 |       | 20180209 |
|   95971462 | 10.04 | 20180209 |
+------------+-------+----------+

上面的查询给了我:

+--------------------+-------+----------------+---------+
| stack1$.idbusiness | value | stack1$.iddate | otherid |
+--------------------+-------+----------------+---------+
|           95971462 |       |       20180209 |    5235 |
|           95971462 |       |       20180209 |    5235 |
|           95971462 |       |       20180209 |    5235 |
|           95971462 |       |       20180209 |    5235 |
|           95971462 |       |       20180209 |    5235 |
|           95971462 | 10.04 |       20180209 |    5235 |
|           95971462 |       |       20180209 |    5235 |
|           95971462 |       |       20180209 |    5235 |
+--------------------+-------+----------------+---------+

现在我想向其中添加 Stack 2,它将包含与 stack1 相同的列,但与 stack1 中的 idbusiness 不同。也看起来不需要 iddate,所有记录都是相同的日期。

不要混用 old-style 和 new-style 联接。

像这样的东西应该可以工作:

select *
from ([overflow$] as o inner join
      [stack1$] as s1
      on s1.[iddate] = o.[iddate] and
         s1.[idbusiness] = o.[idbusiness]
     ) inner join
     [stack2$] as s2
     on s2.[iddate] = o.[iddate] and
        s2.[idbusiness] = o.[idbusiness];

我用 MS Access 语法写了这篇文章。其他数据库不需要括号。

正如 Gordon 所说,不建议在同一个查询中混合隐式和显式联接。以下是使用隐式连接编写查询的方式:

SELECT *
FROM [overflow$], [stack1$], [stack2$]
WHERE [stack1$].[iddate] = [overflow$].[iddate]
  AND [stack1$].[idbusiness] = [overflow$].[idbusiness]
  AND [stack2$].[iddate] = [overflow$].[iddate]
  AND [stack2$].[idbusiness] = [overflow$].[idbusiness]

为了完整起见,以下是使用显式连接编写查询的方式(如 Gordon 的回答,但使用您的命名风格):

SELECT *
FROM ([overflow$]
      INNER JOIN [stack1$]
              ON [stack1$].[iddate] = [overflow$].[iddate]
             AND [stack1$].[idbusiness] = [overflow$].[idbusiness])
INNER JOIN [stack2$]
        ON [stack2$].[iddate] = [overflow$].[iddate]
       AND [stack2$].[idbusiness] = [overflow$].[idbusiness]

一般推荐使用显式连接。遗憾的是,Jet 语法需要括号来连接,这使得编写和阅读变得更加困难。

如果这些条件正确,上面的两个查询应该是相同的,并且给你相同的结果。但是,某些数据库具有 issues/bugs 和隐式连接,因此结果(主要是性能)可能会有所不同。我不知道 Vertica,但对于最近版本的 SQL Server,应该没有区别。

如果您没有从上述查询中获取记录,则条件可能有误。我怀疑您实际上想要结合 UNION:

的两个查询的结果
SELECT *
FROM [overflow$]
INNER JOIN [stack1$]
        ON [stack1$].[iddate] = [overflow$].[iddate]
       AND [stack1$].[idbusiness] = [overflow$].[idbusiness]
UNION ALL
SELECT *
FROM [overflow$]
INNER JOIN [stack2$]
        ON [stack2$].[iddate] = [overflow$].[iddate]
       AND [stack2$].[idbusiness] = [overflow$].[idbusiness]

尝试 Union,它将为您提供 (overflow$ join stack1$) union (overflow$ join stack2) 的唯一行。

SELECT * FROM [overflow$]
JOIN [stack1$]
ON [stack1$].[iddate] = [overflow$].[iddate]
AND [stack1$].[idbusiness] = [overflow$].[idbusiness]
        UNION 
SELECT * FROM [overflow$]
JOIN [stack2$]
ON [stack2$].[iddate] = [overflow$].[iddate]
AND [stack2$].[idbusiness] = [overflow$].[idbusiness]