2014-03-05 32 views
0

的更簡單的方法我有兩個表如下:加入多列一看錶

TablePC 

+------+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 
| PCID | Option1 | Option2 | Option3 | Option4 | Option5 | Option6 | Option7 | Option8 | Option9 | 
+------+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 
| 1 | JM2  | JM3  | JM4  | JM5  |   |   |   |   |   | 
+------+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 

Options 

+----------+---------------+----------------+ 
| OptionID | Description | ExtendedDetail | 
+----------+---------------+----------------+ 
| JM2  | Graphics Card | ATI X1950XT | 
+----------+---------------+----------------+ 

而不是寫類似

SELECT Code,Description FROM 

(SELECT * FROM TablePC) c 
JOIN 
(SELECT * FROM Options) o 
ON c.Option1 = o.Code 
OR c.Option2 = o.Code 
OR c.Option2 = o.Code 
OR c.Option3 = o.Code 
OR c.Option4 = o.Code 
OR c.Option5 = o.Code 
OR c.Option6 = o.Code 
OR c.Option7 = o.Code 
WHERE c.PCID = 1 

是有更簡潔的書寫方式還是可以接受的?我有12個選項字段。

p.s.我如何在其他問題中看到如何格式化sql表/結果?我必須編寫並縮進代碼。

感謝

+1

1.規範化數據。和p.s. - 這就是如何!我使用了一種文本編輯器,使得這種事情非常容易。 – Strawberry

+0

@Strawberry我傾向於同意,但現在,該項目無法實現正常化。 - 在進入文本編輯器之前,在文本編輯器或縮進之前? – DarkShadowAY

+0

那麼這是一個關於「更清潔,更簡單的方式」問題的答案,所以備選答案是「聯合」或「否」。拿你的選擇;-) – Strawberry

回答

1

好正常化之外,你可以簡單地通過使用IN整理這件事:

SELECT Code,Description FROM 

(SELECT * FROM TablePC) c 
JOIN 
(SELECT * FROM Options) o 
ON o.Code IN (c.Option1, c.Option2, c.Option3, c.Option3, c.Option4, c.Option5, c.Option6, c.Option7, c.Option8) 
WHERE c.PCID = 1; 

而且你的子查詢是多餘的並會阻礙性能。 MySQL將放子查詢到臨時表(派生表)的結果在執行的開始,因此,在一個簡單的例子:

SELECT * 
FROM T 
WHERE T.ID = 1; 

SELECT * 
FROM (SELECT * FROM T) T 
WHERE T.ID = 1; 

你把T的全部內容到一個臨時表中,僅選擇一個行從那。如果您檢查this SQL Fiddle上的查詢計劃,您將看到第二個查詢甚至無法使用ID上的主鍵索引執行過濾器。

這樣您的查詢應該更像:

SELECT Code, Description 
FROM TablePC c 
    JOIN Options o 
     ON o.Code IN (c.Option1, c.Option2, c.Option3, c.Option3, c.Option4, c.Option5, c.Option6, c.Option7, c.Option8) 
WHERE c.PCID = 1; 
0

你也可以 '在' 使用方法:

SELECT Code,Description FROM 

(SELECT * FROM TablePC) c 
JOIN 
(SELECT * FROM Options) o 
ON o.Code in (c.Option1,c.Option2,c.Option3,c.Option4,c.Option5,c.Option6,c.Option7) 
WHERE c.PCID = 1