0

我有一个颜色名称表

Red
Yellow
Green
Purple

我还有一张彩色上衣表

RedandGreen
Red
YellowandRedandGreen
Violet

我想做的是创建第三张表,如果我选择红色,它将显示所有带有红色的顶部,而我想做的另一件事是,如果我选择紫色,它需要带回紫罗兰色。

这可能吗?

谢谢

W

4

5 回答 5

2

是的,这是可能的,但这将是非常不切实际的。尤其是当您开始添加越来越多的紫色色调时,例如淡紫色、淡紫色、淡紫色等。这不是一个好主意。

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

颜色表

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

彩色上衣

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

color_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
于 2013-04-30T13:27:22.897 回答
2

对于 Purple = Violet,我看不到任何方法可以做到这一点,而不是有另一个查找表。例如,系统应该如何知道浅蓝色和青色是相同的颜色?

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并且只有一个颜色定义表。

于 2013-04-30T13:22:01.703 回答
1

您可以创建一个连接表:

创建带有 id 的表

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

于 2013-04-30T13:31:55.227 回答
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)
于 2013-04-30T13:27:13.940 回答
0

不知道为什么要从中创建另一个表,但是这样的工作是否可行:

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

SQL 小提琴演示

然后,您可以WHERE根据需要添加您的标准——where c.color = 'Red'例如。

- 编辑

正如其他人所建议的那样,考虑为您的颜色使用查找表。像这样的东西:

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 + '%'

另一个演示

于 2013-04-30T13:19:31.163 回答