2013-10-07 17 views
3

您好我目前有3個表如下所列。有表之間沒有共同的鍵加入多個表沒有公用密鑰

表1-> linkage_Table

ID Item   Material  Color 
1 keypouch  *    yellow 
2 wallet  plastic  * 
3 card-holder leather  gold 

表2-> Material_Table

ID Name   
1 plastic 
2 wool 
3 leather 

表3-> Color_Table

ID Color 
1 Yellow 
2 green 
3 orange 

我會希望得到以下結果集

Item   Material Color 

keypouch  plastic  yellow 
keypouch  wool  yellow 
keypouch  leather  yellow 
wallet  plastic  yellow 
wallet  plastic  green 
wallet  plastic  orange 
card-holder leather  gold 

我想編寫一個SQL語句將表連接在一起。

*在鏈接表中將意味着我們將從材質或顏色表中檢索所有值。

我現在真的需要這個解決方案。一直試圖解決這個問題超過5小時。預先感謝您的幫助。

回答

3

一個可能的方法:

SELECT l.Item, m.name, c.Color 
     FROM linkage_Table AS l 
INNER JOIN Material_Table AS m 
     ON l.Material = '*' 
      OR l.Material = m.name 
INNER JOIN Color_Table AS c 
     ON l.Color = '*' 
      OR l.Color = c.Color 

SQL Fiddle

說明:查詢有要建使得「物質」和「顏色」表的連接或者完全(交叉連接),當'*'在相應的領域給出,或者通過這些領域的平等給出。這正是我們通過使用'ON l.someField = '*' OR l.someField = joined.someField'條款所得到的結果。

+0

在特定行爲編碼爲一個單獨列的值是當它可以使用數據(尤其是因爲需要額外的數據是比較小的),其它顏色意味着增加額外的記錄,處理不好的做法如果添加了另一種顏色,則不會自動將其作爲用戶的選擇而被允許,這可能不是預期的功能。 –

+0

感謝您的幫助!!!!! – Louis

0

由於JOIN不會在源表中使用*,因此JOIN不會在目錄表中使用*,而需要在數據庫中爲每條記錄添加一個條目。

ID商品材質顏色 1 keypouch黃色塑料 4 keypouch毛黃 5 keypouch皮革黃色

又一次的顏色類似的事情。 此外,由於您要加入基於公共列的數據,因此使用目標表的主鍵作爲源表中要加入的列通常更好(也更快)。這允許聯接使用索引並執行得更快。

1

隨着例如:

CREATE TABLE linkage_table (
    id INT, 
    item VARCHAR(40), 
    material VARCHAR(40), 
    color VARCHAR(40) 
); 

CREATE TABLE material_table (
    id INT, 
    name VARCHAR(40) 
); 

CREATE TABLE color_table (
    id INT, 
    color VARCHAR(40) 
); 

INSERT INTO linkage_table VALUES (1, 'keypouch', '*', 'yellow'); 
INSERT INTO linkage_table VALUES (2, 'wallet', 'plastic', '*'); 
INSERT INTO linkage_table VALUES (3, 'card-holder', 'leather', 'gold'); 

INSERT INTO material_table VALUES (1, 'plastic'); 
INSERT INTO material_table VALUES (2, 'wool'); 
INSERT INTO material_table VALUES (3, 'leather'); 

INSERT INTO color_table VALUES (1, 'yellow'); 
INSERT INTO color_table VALUES (2, 'green'); 
INSERT INTO color_table VALUES (3, 'orange'); 

SELECT l.item AS Item, m.name AS Material, IFNULL(c.Color, l.color) 
    FROM linkage_table l 
    LEFT JOIN material_table m ON (l.material = m.name OR l.material = '*') 
    LEFT JOIN color_table c ON (l.color = c.color OR l.color = '*') 
; 

返回你想要的到底是什麼。不確定您的樣本數據是否缺乏「黃金」顏色?

檢查在SQLFiddle:http://sqlfiddle.com/#!2/d9d3d/4

+0

感謝您的幫助!!!!! – Louis