2016-08-23 91 views
0

多單聯接表中選擇數據我有一個回合20桌與像t00XX_b命名方案和相應的t00XX_b_results 我想要做的就是加入那些對做出一個選擇對所有這些表添加數據到一個大表。對我來說,從邏輯上講,它應該以這種方式工作:從沒有完成

SELECT 
    * 
FROM 
    (t0001_b AS t1 
    RIGHT JOIN t0001_b_results AS t2 ON t1.IndexResult = t2.IndexResult), /*generates ~20000 rows*/ 
    (t0002_b AS t3 
    RIGHT JOIN t0002_b_results AS t4 ON t3.IndexResult = t4.IndexResult), /*generates ~6000 rows*/ 
    ... 

但只要我鏈上的表,查詢不會結束了。如果我使用單個表對執行查詢,它可以很好地工作。

這個例子正常工作:

SELECT 
    * 
FROM 
     (t0001_b AS t1 
     RIGHT JOIN t0001_b_results AS t2 ON t1.IndexResult = t2.IndexResult) 

我不能看到一個錯誤,但我並沒有在SQL的專家。 有什麼問題?有錯誤的順序嗎?

回答

1

我不知道這是你想要的邏輯,但你的查詢懷疑是正確的。逗號是創建笛卡爾積的CROSS JOIN運算符。

另外,我的猜測是MySQL將實現每個連接對。

我真的不能做一個具體的建議,而不樣本數據和預期的結果,但也許你想這樣的:

SELECT * 
FROM t0001_b t1 RIGHT JOIN 
    t0001_b_results t2 
    ON t1.IndexResult = t2.IndexResult 
UNION ALL 
SELECT * 
FROM t0002_b t3 
    t0002_b_results t4 
    ON t3.IndexResult = t4.IndexResult 
. . . 

注:

  • 不要使用SELECT *,尤其是對UNION ALL操作。您應該明確列出列,特別是當表共享列名時。
  • 我更喜歡LEFT JOINRIGHT JOIN。語義更容易(「保留第一個表中的所有行」)
+0

噢,謝謝,我不知道'''是一個真正的操作符。這解釋了很多。有了'UNION ALL',它就像一個魅力一樣。我也會交換'*'選擇器。非常感謝! –