您好我目前有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语句来将表连接在一起。
在链接表中使用*意味着我们将从Material或Color表中检索所有值。
我现在真的需要这个解决方案。一直试图解决这个问题超过5小时。提前感谢您的帮助。
答案 0 :(得分: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
说明:必须构建查询,以便“材料”和“颜色”表完全连接(交叉连接),在相应字段中给出'*'
时,或者通过这些字段的相等性连接。而这正是我们使用'ON l.someField = '*' OR l.someField = joined.someField'
子句所获得的。
答案 1 :(得分: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
答案 2 :(得分:0)
而不是在表中使用*,因为JOIN不会基于在源表中使用*来获取目标表中的多个条目,您需要在数据库中为每个记录创建一个条目。
ID项目材质颜色 1个钥匙包塑料黄色 4个keypouch羊毛黄色 5个钥匙包皮革黄色
对于颜色再次类似的事情。 此外,由于您将基于公共列加入数据,因此通常更好(并且更快)将目标表的主键用作源表中要从中加入的列。这允许连接使用索引并执行得更快。