色名の表があります
Red
Yellow
Green
Purple
カラートップスのテーブルもあります
RedandGreen
Red
YellowandRedandGreen
Violet
私がやりたいことは、3 番目のテーブルを作成することです。ここで、赤を選択すると、赤が含まれるすべてのトップが表示されます。もう 1 つは、紫を選択すると、紫を戻す必要があることです。
これは可能ですか?
ありがとう
W
色名の表があります
Red
Yellow
Green
Purple
カラートップスのテーブルもあります
RedandGreen
Red
YellowandRedandGreen
Violet
私がやりたいことは、3 番目のテーブルを作成することです。ここで、赤を選択すると、赤が含まれるすべてのトップが表示されます。もう 1 つは、紫を選択すると、紫を戻す必要があることです。
これは可能ですか?
ありがとう
W
はい、可能ですが、非常に非現実的です。特に、藤色、ラベンダー、ライラックなどの紫の色合いをどんどん追加し始めると、それは良い考えではありません.
あなたがしなければならないことは、colors_to_tops と呼ばれる 3 番目のテーブルを作成し、データを入力するときに、各トップを返してほしいすべての色に割り当てることです。
カラーテーブル
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
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
色定義テーブルを 1 つだけ持つことができます。
私の意見では、情報を表示するために 3 つ目のテーブルを作成する必要はありません。正しい外部キーを使用して両方のテーブルをリンクすると、ジョブが機能します。
見る:
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)
結合テーブルを作成できます:
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' ;
そこから別のテーブルを作成する理由はわかりませんが、次のように機能します。
select c.color, t.colors
from color c
left join tops t on t.colors like '%' + replace(c.color,'Purple','Violet') + '%'
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 + '%'