Sql 有没有a';在';查询

Sql 有没有a';在';查询,sql,tsql,Sql,Tsql,我有三张桌子: Silk_Skey Name 1 Black White Checks Yellow Arms 2 Black Crimson Stripes 3 Crimson Yellow Stripes Sub Colour Major Colour Black Black White White Yellow Yellow Crimson Red MajorColour_Skey Major Colour 1 Black 2 White 3

我有三张桌子:

Silk_Skey   Name
1   Black White Checks Yellow Arms
2   Black Crimson Stripes
3   Crimson Yellow Stripes

Sub Colour  Major Colour
Black   Black
White   White
Yellow  Yellow
Crimson Red

MajorColour_Skey    Major Colour
1   Black
2   White
3   Yellow
4   Red
我想做到这一点:

ID  Silk_Skey   MajorColour_Skey
1   1   1
2   1   2
3   1   3
4   2   1
5   2   4
6   3   3
7   3   4
我需要做的是创建一个链接表,匹配3个表中的所有颜色,并分解丝绸名称,以便在新表中显示4行)参见下面的SQL。我的老板建议我使用“正在”查询,但我不知道那是什么,你能帮我吗

SELECT s.Silks_Skey, mc.MajorColour_Skey
FROM Silks s  INNER JOIN SubColour sc  on sc.SubColour **'IS IN HERE'** s.SilksName
INNER JOIN MajorColour mc
ON sc.MajorColour = mc.MajorColour

您可以在

AND table.column IN ('a','b','c')

或者如果你想找一根你能做的绳子

AND table.column LIKE '%word'  -- table.column ends with 'word'
AND table.column LIKE 'word%'  -- table.column starts with 'word'
AND table.column LIKE '%word%' -- table.column has 'word' anywhere in the column

您可以在

AND table.column IN ('a','b','c')

或者如果你想找一根你能做的绳子

AND table.column LIKE '%word'  -- table.column ends with 'word'
AND table.column LIKE 'word%'  -- table.column starts with 'word'
AND table.column LIKE '%word%' -- table.column has 'word' anywhere in the column

对于要执行的操作,您需要执行字符串操作,因为您正在尝试将一种颜色与字符串中的颜色列表进行比较

类似于的
操作员可以执行此操作。在
子句上尝试此

on ' '+ s.SilksName +' ' like '% '+sc.SubColour+' %'
这将检查给定颜色(
sc.subcolor
)是否在列表中(
s.SilksName
)。例如,如果您有一个类似“红-绿”的列表,那么它将匹配“%RED%”或“%GREEN%”

连接空白的目的是避免部分单词匹配。例如,“蓝绿色”将匹配没有分隔符的“蓝色”和“绿色”

下面的查询返回7行,这似乎是正确的(3行用于silks中的第一行,2行用于其他两行):


对于要执行的操作,您需要执行字符串操作,因为您正在尝试将一种颜色与字符串中的颜色列表进行比较

类似于
操作员可以执行此操作。在
子句上尝试此

on ' '+ s.SilksName +' ' like '% '+sc.SubColour+' %'
这将检查给定颜色(
sc.subcolor
)是否在列表中(
s.SilksName
)。例如,如果您有一个类似“红-绿”的列表,那么它将匹配“%RED%”或“%GREEN%”

连接空白的目的是避免部分单词匹配。例如,“蓝绿色”将匹配没有分隔符的“蓝色”和“绿色”

下面的查询返回7行,这似乎是正确的(3行用于silks中的第一行,2行用于其他两行):


这是一个注定会导致性能低下、编写查询困难和痛苦的设计。如果您的数据库永远不会太大,那么它可能是可行的,但是如果它太大,您就不能使用这种设计结构并希望有好的性能,因为您将无法正确使用索引。我个人会添加一个与丝绸表相关的丝绸颜色表,并单独存储颜色。数据库设计的首要规则之一是在一个字段中存储的信息不得超过一条。您正在存储一个列表,这意味着您需要一个相关的表来有效地使用数据库

如果需要使用任何类型的函数或计算进行连接,或者如果需要在like子句中的短语开头使用通配符,则说明数据库设计不好(并且随着时间的推移通常不可行)。现在解决这个问题,事情会更顺利,维护时间会更少,性能会更好。你目前的结构没有任何好处

您可能需要花费一些额外的时间来按颜色解析和存储丝绸名称,但查询数据库所节省的时间将非常重要,因为您现在可以使用连接,然后使用索引。搜索fn_split,您将看到一种将丝绸名称拆分为单独颜色的方法,您可以在插入记录时使用该方法


如果您愚蠢地决定保留当前的结构,那么请考虑使用fuilltext搜索。它将比使用第一个字符为通配符的like子句更快

这是一个注定会导致性能低下、编写查询困难和痛苦的设计。如果您的数据库永远不会太大,那么它可能是可行的,但是如果它太大,您就不能使用这种设计结构并希望有好的性能,因为您将无法正确使用索引。我个人会添加一个与丝绸表相关的丝绸颜色表,并单独存储颜色。数据库设计的首要规则之一是在一个字段中存储的信息不得超过一条。您正在存储一个列表,这意味着您需要一个相关的表来有效地使用数据库

如果需要使用任何类型的函数或计算进行连接,或者如果需要在like子句中的短语开头使用通配符,则说明数据库设计不好(并且随着时间的推移通常不可行)。现在解决这个问题,事情会更顺利,维护时间会更少,性能会更好。你目前的结构没有任何好处

您可能需要花费一些额外的时间来按颜色解析和存储丝绸名称,但查询数据库所节省的时间将非常重要,因为您现在可以使用连接,然后使用索引。搜索fn_split,您将看到一种将丝绸名称拆分为单独颜色的方法,您可以在插入记录时使用该方法


如果您愚蠢地决定保留当前的结构,那么请考虑使用fuilltext搜索。它将比使用第一个字符为通配符的like子句更快

听起来您真正想做的是在空格上拆分
Name
字段,然后对于颜色表中包含的每一个值(如果主颜色也是有效的子颜色,则在子颜色上合并),您希望在新表中输入一个条目。问题是没有用于拆分字符串的内在T-SQL函数。要做到这一点,您最好的选择是访问关于如何做到这一点的最终答案

另一种选择是在谓词中使用CONTAINS关键字,这不是很整洁,可能有效,也可能无效。但是,为了实现这一点,您需要使用全文索引
我怀疑在SQL中使用Erland优秀的giudes来拆分字符串和数组会更合适、更快。

听起来像您真正想要的