好的,所以我在产品表中有一些数据,其中包含一个类别 id 列,该列仅包含类别列表表中使用的 4 个可用字符中的 2 个。
示例:产品的类别 ID 为“AA”,但可能来自台式机 (AAA) 或服务器 (AAB) 类别。
在类别表中,我们有 3 列包含帮助我们的信息:include、atrID 和 valID。valID 列包含一个以逗号分隔的值列表(例如,“K01819”或“K00846,K00851”),这些值可能只包含一个或多个 ID。atrID 列包含一个类似的字符串(例如“A00432”)。包含列是 1 或 0,这取决于很久以前来过的程序员所做的一些工作。
基本上,他浏览了各种表,发现对于某些类别(例如 AA),我们可以从类别表中加入另一个表,并使用 atrID 和 valID 列表将其全部绑定。
例子:
产品“a”的 catID 为 AA,是台式机。这属于“AAA”类别,其中包含 0,atrID 为“A00432”,valID 为“K01819”。
获取类别信息的示例 SQL:
SELECT cat.atrID, cat.valID, cat.[include]
FROM db.dbo.cat AS cat
WHERE cat.catID = 'AAA'
然后,我会将这些变量保存在 .Net 代码中,并根据 include 的值构建 SQL。我还将拆分 valID 并将其作为单独的参数传递,从而在 SQL 服务器上执行以下代码。
SELECT DISTINCT prod.prodID
FROM db.dbo.prod AS prod
INNER JOIN db.dbo.atr AS atr ON atr.prodID = prod.prodID
WHERE prod.catID = 'AA'
AND atr.atrID = 'A00432'
AND atr.valID NOT IN('K01819')
要为服务器更改此设置,我会将其更改NOT IN
为IN
服务器 (AAB) 的包含值为 1。示例:
SELECT DISTINCT prod.prodID
FROM db.dbo.prod AS prod
INNER JOIN db.dbo.atr AS atr ON atr.prodID = prod.prodID
WHERE prod.catID = 'AA'
AND atr.atrID = 'A00432'
AND atr.valID IN('K01819')
我使用IN
andNOT IN
因为某些类别在 valID 列中有多个值。
我的问题是,如果我想在事先不知道的情况下获取特定产品的类别,这是否可能?(未能从您认为它所在的类别中获取所有产品的列表并将其匹配到一个或另一个列表中)。我一直在告诉我的老板我这几天都想不通,而且我什么也没有。任何帮助将不胜感激。
编辑:
我想要做的是获取任何产品的类别。我以上述 SQL 为例,说明了如何获取桌面和服务器类别的产品列表。
我想要反过来,即当我只有产品表中的两个字母类别时,从类别表中获取 3 个字母类别。
编辑2:
产品表列:
prodID varchar(40)
catID char(2)
示例行:
“S101010”、“AA”(桌面)
“S202020”、“AA”(服务器)
“S303030”、“ED”(激光打印机)
“S404040”、“ED”(喷墨打印机)
类别表列:
catID varchar(4)
description varchar(50)
include bit(实际上是一个 tinyint,应该显示我每天处理的内容 =P)
atrID varchar(6)
valID varchar(250)
示例行:
'AAA'、'Desktops'、0、'A00432'、'K01819'、
'AAB'、'Servers'、1、'A00432'、'K01819'、
'EDA'、'Laser Printers'、1、'A00172 ', 'K00846,K00851'
'EDB', '喷墨打印机', 1, 'A00172', 'K00845'
属性表列:
prodID varchar(40)
catID char(2)
atrID varchar(10)
valID varchar(10)
示例行:
“S101010”、“AA”、“A00432”、“K01817”、“
S202020”、“AA”、“A00432”、“K01819”、“
S303030”、“ED”、“A00172”、“K00846”、“S303030
” '、'ED'、'A00172'、'K00851'
'S404040'、'ED'、'A00172'、'K00845'
我上面包含的是当我知道 category.catID 时如何获取产品列表。我想要的是能够在我只有 product.prodID 和 product.catID 的情况下获取类别。
我正在追求这样的东西,但它不完整,不会按原样工作。然后我会检查 catIn.catID 和 catNotIn.catID 的结果,看看哪个不是空的,那将是我的类别,但我无法弄清楚连接。如果它甚至是可能的。而且它没有考虑具有两个以上变体的类别。
SELECT prod.prodID, catIn.catID, catNotIn.catID
FROM product AS prod
INNER JOIN attributes AS atr ON atr.prodID = prod.prodID
LEFT OUTER JOIN category AS catIn ON LEFT(catIn.catID, 2) = prod.catID AND catIn.atrID = atr.atrID --more conditions needed here
LEFT OUTER JOIN category AS catNotIn ON LEFT(catNotIn.catID, 2) = prod.catID AND catIn.atrID = atr.atrID --more conditions needed here
我希望这能更好地解释我所追求的。