连接多个表而不使用公共密钥

时间:2013-10-07 10:23:21

标签: mysql sql

您好我目前有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小时。提前感谢您的帮助。

3 个答案:

答案 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

SQL Fiddle

说明:必须构建查询,以便“材料”和“颜色”表完全连接(交叉连接),在相应字段中给出'*'时,或者通过这些字段的相等性连接。而这正是我们使用'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个钥匙包皮革黄色

对于颜色再次类似的事情。 此外,由于您将基于公共列加入数据,因此通常更好(并且更快)将目标表的主键用作源表中要从中加入的列。这允许连接使用索引并执行得更快。