2013-04-30 165 views
0

我有颜色名称表如何基于其他两个表

Red 
Yellow 
Green 
Purple 

我也有一个表的彩色上装

RedandGreen 
Red 
YellowandRedandGreen 
Violet 

我想要做的是创造什么,创建第三个表第三张桌子,如果我选择红色,它会向我展示红色的所有上衣,另一件我希望它做的事情是如果我选择紫色,它需要带回紫罗兰。

这可能吗?

感谢

W¯¯

回答

1

在我看来,没有必要创建第三个表来显示您的信息。 如果您使用正确的外键链接两个表,您的工作将会奏效。

请参见:

create table color 
(
id_color int not null, 
ds_color varchar(50) null, 
primary key (id_color) 
) 

create table color_tops 
(
id_color int not null, 
id_colortop int not null, 
ds_colortop varchar(50) null, 
primary key (id_colortop), 
foreign key (id_color) references color(id_color) 
) 

select color.ds_color, 
     color_tops.ds_colortops 
from color 
     inner join color on (color.id_color = color_tops.ds_colortops) 
0

不知道为什么你会想创建另一个表出来,但会是这样工作的:

select c.color, t.colors 
from color c 
    left join tops t on t.colors like '%' + replace(c.color,'Purple','Violet') + '%' 

SQL Fiddle Demo

然后你可以根据需要添加WHERE条件 - 例如,where c.color = 'Red'

--edit

正如其他人建议,可以考虑使用查找表来查找你的颜色。事情是这样的:

select c.color, t.colors 
from color c 
    left join coloralias ca on c.color = ca.color 
    left join tops t on t.colors like '%' + c.color + '%' or t.colors like '%' + ca.alias + '%' 

Another Demo

+0

选择c.ColoursName,s.SilksName 从[DBO]。[颜色]Ç 左加入[DBO]。[丝绸] S S上。 SilksName like'%'+ replace(c.ColoursName,'Purple','Violet')+'%' 如何在现阶段不提及紫色紫罗兰的情况下编写查询? – wafw1971 2013-04-30 14:04:02

+0

@ wafw1971 - 如果你不想硬编码紫色=紫罗兰,你需要另一张表 - 像其他人所建议的查找表。 – sgeddes 2013-04-30 14:07:27

+0

我真的很陌生,所以我如何创建一个查找表?我将如何将其链接到上述查询 – wafw1971 2013-04-30 14:11:30

2

我看不到任何方式对紫=紫色不是有另一个表做到这一点。例如系统应该如何知道浅蓝色和青色是相同的颜色?

ColorShades 
PrimaryColor|Shade 
Purple|Purple 
Purple|Violet 
Blue|Blue 
Blue|Cyan 
... 

Tops 
TopColors 
RedandGreen 
Red 
YellowandRedandGreen 
Violet 

SELECT TopColors 
FROM Tops, ColorShades 
WHERE ColorShades.PrimaryColor = Purple 
AND Tops.TopColors like '%ColorShades.Shade%' 

所以你可以有一张表,可以将各种颜色翻译成几个你允许的表格。

假设您使用此选项作为下拉选择,您可以使该选择的来源为SELECT DISTINCT PrimaryColor FROM ColorShades并且只有一个颜色定义表。

+0

如何创建此查找表? – wafw1971 2013-04-30 13:49:21

+0

MS SQL有一些易于使用的可视化工具来创建表格。尝试使用Microsoft SQL Management Studio。 http://www.microsoft.com/en-us/download/details.aspx?id=8961也可以编写SQL来创建表:http://www.w3schools.com/sql/sql_create_table.asp并填充它:http://www.w3schools.com/sql/sql_insert.asp – 2013-04-30 13:59:30

+0

注意这种文本匹配很容易创建和维护,但比其他人提供的基于ID的答案慢。先进的混合解决方案应该是可以轻松编辑文本匹配表,然后定期运行查询来构建ID匹配表以匹配产品。然后,实际的接口将使用更快的ID匹配表。唯一的缺点是A)它需要对你正在做的事情有一个正确的理解,B)在定期查询运行之前,新产品不会以彩色搜索显示。 – 2013-04-30 14:04:11

2

是的,这是可能的,但是这将是可怕的不切实际。特别是当你开始添加越来越多的阴影时紫色,如淡紫色,薰衣草,丁香等。这不是一个好主意。

您需要做的是创建第三个名为colors_to_tops的表格,并在输入数据时,将每个顶部分配给您希望返回的每种颜色。

颜色表

id|color 
-------- 
1|Red 
2|Yellow 
3|Green 
4|Purple 

彩色上衣

id|TopName 
-------------- 
1|RedandGreen 
2|Red 
3|YellowandRedandGreen 
4|Violet 

colors_to_tops

id|colorID|topID 
---------------- 
1|  1| 1 
2|  1| 2 
3|  1| 3 
4|  2| 3 
5|  3| 1 
6|  3| 3 
7|  4| 4 

SQL:

SELECT DISTINCT ct.* FROM 
    ColoredTops AS ct 
LEFT JOIN 
    Colors_To_Tops AS ctt 
ON 
    ct.id = ctt.topID 
LEFT JOIN 
    Colors AS c 
ON 
    ctt.colorID = c.id 

WHERE c.color = @color 
+0

嗨胡安,这正是我想要的,但colors_to_tops如何知道使用什么颜色ID什么是SQL? – wafw1971 2013-04-30 13:30:37

+0

将SQL添加到我的答案中。 – 2013-04-30 13:38:52

1

您可以创建一个连接表:

创建表与IDS

CREATE TABLE colour ( 
id int primary key, 
colour varchar(10) 
); 

create table tops (
    id int primary key, 
    tops varchar(50) 
); 

创建一个连接表来联系他们

create table top_colours 
(
    top_id int, 
    colour_id int 
) 

添加数据

insert into tops(id,tops) 
select 
1, 'RedandGreen' 
union select 
2, 'Red' 
union select 
3, 'YellowandRedandGreen' 
union select 
4, 'Violet'; 


insert into colour(id,colour) 
select 1, 'Red' 
union select 
2, 'Yellow' 
union select 
3,'Green' 
union select 
4,'Purple'; 

insert into top_colours(top_id,colour_id) 
select 1,1 union 
select 1,3 union 
select 2,1 union 
select 3,2 union 
select 3,1 union 
select 3,3 union 
select 4,4; 

问远

select distinct tops.* from tops 
join top_colours tc on tc.top_id = tops.id 
join colour c on c.id = tc.colour_id 
where c.colour = 'red' ; 

select distinct tops.* from tops 
join top_colours tc on tc.top_id = tops.id 
join colour c on c.id = tc.colour_id 
where c.colour = 'purple' ; 

sql fiddle