我正在尝试构建一个查询,该查询将根据用户输入的表中的参考数据查找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_category
,product_subcategory
和subcategory.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。
感谢任何其他帮助。 谢谢,
答案 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