2013-04-30 167 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