连接表中的SQL Lookup数据基于存储在连接表列中的LIKE值

时间:2014-03-18 16:21:54

标签: sql sql-server database sql-server-2012-express

我正在尝试构建一个查询,该查询将根据用户输入的表中的参考数据查找product_subcategory并将两个表连接在一起。我的数据库是SQL Server 2012 Express。

首先,products表有三列:Product_id(唯一标识符),event_id(INT数据类型)和product_category。 (product_category需要是字母数字当前varchar(32)数据类型)

示例Products表数据:

Product_id  event_id    product_category
1           20          100
2           20          105
3           20          200
4           21          100
5           21          200
6           21          203
7           22          105
8           22          207

其次,事件表有两列:event_id(唯一标识符,INT数据类型)和zone(浮点数据类型,不知道为什么这个设置为float,可能应该是INT但它是一个预先存在的表和我不想改变它)

event_id      zone
20            1
21            2
22            3

第三,subcategory表有四列:subcategory_id(唯一标识符,INT数据类型),zone(加入zone表中的products列,INT数据类型),category_lookup(varchar(max)数据类型)和product_subcategory(varchar(50)数据类型)。这是我为这个项目创建的表,所以我可以将结构或数据类型更改为项目所需的任何内容,我在其他表上没有这种灵活性。

示例Subcategory表数据:

subcategory_id  zone    category_lookup    product_subcategory
1               1       '1%'               25
2               1       '2%'               23
3               2       '1%'               26
4               2       '2%'               30

我想构建一个搜索产品表的查询,并根据zone列中的值将product_categoryproduct_subcategorysubcategory.category_lookup匹配在一起。

我想从查询返回的数据是:

product_ID  zone    product_category    product_subcategory
1           1       100                 25
2           1       105                 25
3           1       200                 23
4           2       100                 26
5           2       200                 30
6           2       203                 30
7           3       105                 NULL or 'N/A'
8           3       107                 NULL or 'N/A'

查找匹配子类别的逻辑将类似于以下内容:(这基本上是存储在子类别表中的内容)(“引号”中的文本是我的意思是参考数据,并且将由用户输入)

IE... if zone = 1 and product_category “begins with 1” then product_subcategory = 25
IE... if zone = 1 and product_category “begins with 2” then product_subcategory = 23
IE... if zone = 2 and product_category “begins with 1” then product_subcategory = 26
IE... if zone = 2 and product_category “begins with 2” then product_subcategory = 30

我明白我的逻辑问题之一是,如果多个子类别与一个产品匹配,那么它会抛出一个错误,但我想我可以编码一旦我将其中的一部分工作

我很喜欢这个项目的不同方向,但这是我决定解决它的第一种方式。最重要的组成部分是product_subcategory将位于单独的用户输入表中,并且需要用户输入逻辑,如上所述,以确定基于区域的product_subcategory和{ {1}}。

我根本不是SQL大师,所以我甚至不知道从哪里开始处理这个问题。任何建议都表示赞赏。

根据我到目前为止收到的答案,我想出了这个:

product_category

但不幸的是,它只返回所有product_subcategory结果的NULL。

感谢任何其他帮助。 谢谢,

3 个答案:

答案 0 :(得分:0)

未经测试,但这是您正在寻找的吗?

select a.product_ID, a.zone, a.product_category, b.product_subcategory
from Products a
inner join Subcategory on ((a.zone = b.zone) and (a.product_category like b.category_lookup))

答案 1 :(得分:0)

试试这个..

select p.product_id, p.zone, p.product_category, isnull(s.product_subcategory,'NA') as product_subcategory
from Products p
left outer join Subcategory s on (s.zone = p.zone and p.product_category like s.category_lookup);

答案 2 :(得分:0)

这应该可以解决问题,您只需要修改CAST(p.zone as nchar(10)),为category_lookup列插入正确的数据类型,代替nchar(10),我假设{ zone中的{1}}是Products,其中查找列是基于字符串的列:

int

根据您的更新,以下内容应该有效:

SELECT p.product_id, p.zone, p.product_category, sc.product_subcategory
FROM Products p
LEFT JOIN SubCategory sc ON p.zone = sc.zone
AND CAST(p.zone as nchar(10)) like sc.category_lookup

根据评论进行更新:

SELECT p.product_id, p.event_id, e.zone, p.product_category, 
       sc.product_subcategory
FROM Products p
INNER JOIN events e on p.event_id = e.event_id
LEFT OUTER JOIN SubCategory sc ON e.zone = sc.zone 
     AND CAST(e.zone as nchar(250)) LIKE CAST(sc.category_lookup as nchar(250))

工作样本 SQLFiddle