将多个列连接到一个查找表的简单方法

时间:2014-03-05 09:55:18

标签: mysql sql

我有两张表如下:

 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表/结果的格式?我必须编写并缩进代码。

由于

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

你也可以使用'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.Option4,c.Option5,c.Option6,c.Option7)
WHERE c.PCID = 1