Join

處理 4 個表並顯示 4 列作為結果

  • February 6, 2019

我不知道如何建構涉及 4 個表並顯示這 4 列的正確查詢: 我的 4 張桌子 我想顯示這 4 行,每行來自不同的表。

編輯: 每家公司都屬於一個部門。而且由於數據是如何在數據庫中送出和處理的,我不能只在 2 個表中包含所有內容。每張桌子都有不同的用途。

到目前為止,我已經嘗試過UNION/UNION ALL

SELECT Companies.Symbol, CompanyData.strenght FROM Companies
INNER JOIN CompanyData ON Companies.CompanyID = CompanyData.CompanyID
       WHERE CompanyData.strenght = 'anything'
UNION ALL 
SELECT Sectors.SectorName, SectorTrend.Trend FROM    
SectorTrend
INNER JOIN Sectors ON Sectors.SectorID = SectorTrend.SectorID

我只得到 2 列:符號和強度

嵌套查詢的幾個 JOINS:

SELECT SectorTrend.Trend
FROM (
   SELECT Sectors.SectorName
   FROM (
       SELECT Companies.Symbol, CompanyData.strenght 
       INNER JOIN CompanyData ON Companies.CompanyID = CompanyData.CompanyID
       WHERE CompanyData.strenght = 'anyvalue'
        )
   INNER JOIN Sectors ON Sectors.SectorID = SectorTrend.SectorID
   WHERE Sectors.SectorID = 'anynumber'
    )
   INNER JOIN SectorTrend ON SectorTrend.SectorID = Sectors.SectorID 

我在第 5 行遇到了一些無法解決的 sintax 錯誤。

使用普通的 JOIN 查詢:

SELECT Companies.Symbol, Sectors.SectorName, CompanyData.strenght , 
SectorsTrend.Trend FROM Companies
INNER JOIN Companies ON Companies.SectorID = Sectors.SectorID
INNER JOIN CompanyData ON CompanyData.CompanyID = Companies.CompanyID
INNER JOIN SectorTrend ON SectorsTrend.SectorID = Sectors.SectorID 

我得到Error: Table/alias Companies is not unique。我一直在玩切換查詢順序,沒有任何運氣。

有什麼我遺漏的嗎,或者您能指出另一種處理此查詢的方法嗎?單獨處理的兩個查詢都可以正常工作。我應該單獨處理它,將結果儲存在任何變數中,然後創建一個視圖來顯示結果嗎?

提前致謝。

更新#1 根據@Kondybas 的建議,我重寫了查詢,結果為空。

這是一個多列索引問題,當我執行 EXPLAIN SELECT… 時,有 NULLS 鍵和可能的 NULL 鍵,所以我在幾列中添加了索引:CREATE INDEX _indexname_ ON _tablename_ (_column1_, _column2_);現在查詢執行得更快。

JOIN SectorTrend AS st ON st.SectorID = s.SectorID但是只有當我刪除最後一個 JOIN:並且不使用任何 WHERE 條件時才能獲得結果。所以看起來問題是最後一次加入。

最終查詢是(更改並包含一些列名稱):

EXPLAIN SELECT c.Symbol , s.SectorName , cprs.strenght , ssbpi.ColumnType FROM Companies AS c JOIN Sectors AS s ON s.SectorID = c.SectorID JOIN CompanyPriceRS AS cprs ON cprs.CompanyID = c.CompanyID JOIN SubSectorsBPIsData AS ssbpi ON ssbpi.SectorID = s.SectorID WHERE cprs.strenght = 'strong' AND c.SectorID = '16'

並且EXPLAIN SELECT…結果: 在此處輸入圖像描述

首先,我將解釋錯誤/錯誤。

1) UNION提供垂直合併而不是水平合併。

+---+---+         +---+---+     +---+---+       
| A | B |         | A | B |     | 1 | 2 |
+---+---+         +---+---+     | 3 | 4 |              +---+---+---+---+
| 1 | 2 |  UNION  | 6 | 7 |  =  | 6 | 7 |          not | 1 | 2 | 6 | 7 |
| 3 | 4 |         | 8 | 9 |     | 8 | 9 |              | 3 | 4 | 8 | 9 |
+---+---+         +---+---+     +---+---+              +---+---+---+---+

UNION要求兩個合併表具有相同名稱/類型/順序的列。這就是為什麼您只得到兩列而第二個表中的列和行消失的原因。

2) “某些語法錯誤”是查詢使用的每個表源都應該具有名稱的要求。當您使用子查詢時,您應該給它一個別名:

SELECT SectorTrend.Trend
 FROM ( SELECT Sectors.SectorName
          FROM ( SELECT Companies.Symbol, CompanyData.strenght 
                  --- some missed clause should be here
                  INNER JOIN CompanyData ON Companies.CompanyID = CompanyData.CompanyID
                  WHERE CompanyData.strenght = 'anyvalue'
               ) AS aaa --- that's what I mean
         INNER JOIN Sectors ON Sectors.SectorID = SectorTrend.SectorID
         WHERE Sectors.SectorID = 'anynumber'
     ) AS bbb --- that's what I mean
INNER JOIN SectorTrend ON SectorTrend.SectorID = Sectors.SectorID 

無論如何,該查詢過於復雜且錯誤,無法使用。

3) Multiple JOINs

你的錯誤是你已經加入了Companies兩次表(而不是Sectors)並且引擎無法區分一個實例和另一個實例。好的做法是為查詢中的每個表分配一個唯一的別名:

SELECT c.Symbol
    , s.SectorName
    , cd.strenght 
    , st.Trend 
 FROM Companies   AS c
 JOIN Sectors     AS s  ON s.SectorID   = c.SectorID
 JOIN CompanyData AS cd ON cd.CompanyID = c.CompanyID
 JOIN SectorTrend AS st ON st.SectorID  = s.SectorID 

我已將 s 替換為INNER JOINs,JOIN因為(至少在 mysql 方言中)它們與 withON子句完全相同。這個查詢是我的任務選擇。

引用自:https://dba.stackexchange.com/questions/228580