[英]Inner join 2 tables into one
我有2個表,試圖將inner join
成一個表。 我正在使用Excel進行查詢,因此語法有限(Jet Access)。 stack1
和stack2
表是相同的,並且在兩個不同的Excel工作表中。
這些表來自Vertica( stack1
和stack2
)和SQL Server( overflow
),然后我嘗試使用內部查詢來組合這些表。
這是我嘗試過的方法,對此我遇到語法錯誤,不確定我要去哪里錯誤:
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]
如果我只像這樣做一張桌子,那就可以了:
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
相同的列,但與idbusiness
中的stack1
不同。 看起來好像iddate
,所有記錄都是相同的日期。
試試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]
不要混合使用舊式和新式聯接。
這樣的事情應該起作用:
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語法編寫的。 在其他數據庫中不需要括號。
就像戈登所說,不建議在同一查詢中混合使用隱式和顯式聯接。 這是使用隱式聯接編寫查詢的方式:
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]
為了完整起見,這是使用顯式聯接編寫查詢的方式(如戈登的答案,但使用您的命名方式):
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語法在連接時需要括號,這使得編寫和讀取變得更加困難。
如果這些條件正確,則上面的兩個查詢應相同,並為您提供相同的結果。 但是,某些數據庫存在隱式聯接的問題/錯誤,因此結果(主要是性能)可能會有所不同。 我不了解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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.