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 语句来将这些表连接在一起。

在链接表中有 * 意味着我们将从 Material 或 Color 表中检索所有值。

我现在真的很需要这个解决方案。已经尝试解决这个问题超过 5 小时。提前感谢您的帮助。

4

3 回答 3

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小提琴

说明:必须构建查询,以便“材料”和“颜色”表完全连接(交叉连接),当'*'在相应字段中给出时,或者通过这些字段的相等性。这正是我们通过 using'ON l.someField = '*' OR l.someField = joined.someField'子句得到的。

于 2013-10-07T10:28:22.460 回答
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

于 2013-10-07T10:35:42.813 回答
0

而不是在表中使用 *,因为 JOIN 不会基于在源表中使用 * 来获取目标表中的多个条目,您需要在数据库中为每条记录创建一个条目。

ID 项目 材料 颜色 1 钥匙袋塑料黄色 4 钥匙袋羊毛黄色 5 钥匙袋皮革黄色

颜色也是类似的。此外,由于您将基于公共列连接数据,因此使用目标表的主键作为要连接的源表中的列通常会更好(并且更快)。这允许连接使用索引并更快地执行。

于 2013-10-07T10:29:37.463 回答