簡體   English   中英

內部將2張桌子合為一體

[英]Inner join 2 tables into one

我有2個表,試圖將inner join成一個表。 我正在使用Excel進行查詢,因此語法有限(Jet Access)。 stack1stack2表是相同的,並且在兩個不同的Excel工作表中。

這些表來自Vertica( stack1stack2 )和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM