我有两张表如下:
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表/结果的格式?我必须编写并缩进代码。
由于
答案 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