處理 4 個表並顯示 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'
首先,我將解釋錯誤/錯誤。
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
JOIN
s你的錯誤是你已經加入了
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 JOIN
s,JOIN
因為(至少在 mysql 方言中)它們與 withON
子句完全相同。這個查詢是我的任務選擇。