内部将 2 个表合二为一
Inner join 2 tables into one
我有2个table,想inner join
变成一个table。我正在使用 Excel 进行查询,因此它的语法有限 (Jet Access)。 stack1
和 stack2
table 是相同的,在两个不同的 Excel 工作表中。
table来自 Vertica(stack1
和 stack2
)和 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]
我有2个table,想inner join
变成一个table。我正在使用 Excel 进行查询,因此它的语法有限 (Jet Access)。 stack1
和 stack2
table 是相同的,在两个不同的 Excel 工作表中。
table来自 Vertica(stack1
和 stack2
)和 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]