我有一个 SQL 查询,希望你能帮我弄清楚。
这应该很容易,我的脑袋今天不生产了。
这是表格的示例
Tbl产品
ID | SKU | Price
-----------------
1 | ABC | 10.00
2 | DEF | 5.00
3 | OSKD | 6.00
4 | 123 | 6.00
5 | LPD | 12.00
6 | TRE | 3.00
TblCategories
ID | Name | Active |Sort
-------------------------
1 | Home | 1 |4
2 | Garden| 1 |55
3 | Misc | 1 |2
4 | Test | 0 |1
TblAlternateCategoryName
ID | CategoryID | AltName
-------------------------
1 | 1 | House
2 | 1 | Crib
3 | 3 | Anything
TblProductX类别
ID | ProductID | CategoryID | SortOrder
---------------------------------------
1 | 1 | 1 | 1
2 | 1 | 2 | 1
4 | 2 | 2 | 4
5 | 2 | 3 | 6
6 | 3 | 3 | 6
7 | 4 | 4 | 0
8 | 5 | 2 | 1
需要这个结果
SKU | Price | Category | AlternateCategory
-------------------------------------------
ABC | 10.00 | Home | House
DEF | 5.00 | Misc | Anything
OSKD | 6.00 | Misc | Anything
LPD | 12.00 | Garden | Null
规则
- 每个产品返回一个类别。(最低的排序)
- 产品必须在活动类别中。
- 如果可用但不是必需的,请使用 AlternateCategory。
- 排序有时可能是重复的。
提前致谢
这是原始的 SQL 语句
DECLARE @feedID int =4
SELECT Pro_Chl.id,
Pro_Chl.sku,
Pro_Chl.productname,
(SELECT top 1 tbl_componentsettinglist.componentsubtype
FROM tbl_offers
INNER JOIN tbl_componentsettinglist
ON tbl_offers.id = tbl_componentsettinglist.componentid
WHERE ( tbl_componentsettinglist.componentsubtype = N'Free Shipping' )
AND ( tbl_componentsettinglist.componenttype = N'Offer' )
AND ( tbl_offers.startdate <= { fn NOW() } )
AND ( tbl_offers.enddate > { fn NOW() } )
AND ( tbl_offers.enabled = 1 )
AND ( Pro_Chl.id = tbl_componentsettinglist.setting1 )
ORDER BY tbl_offers.[order]) AS FreeShipping,
TblCategories.name AS CategoryName,
TblAlternateCategoryName.value AS FeedCat
FROM TblProducts AS Pro_Chl
INNER JOIN (
SELECT productid,
categoryid,
sortorder
FROM TblProductXCategories main
WHERE sortorder = (
SELECT top 1 Min(srt.sortorder)
FROM TblProductXCategories srt
INNER JOIN TblCategories
ON srt.categoryid =
TblCategories.id
WHERE srt.productid = main.productid
AND srt.categoryid = main.categoryid
AND TblCategories.hidden = 0
)
)
AS PxC
ON ( Pro_Chl.id = PxC.productid
OR Pro_Chl.parentid = PxC.productid )
INNER JOIN TblCategories
ON PxC.categoryid = TblCategories.id
LEFT OUTER JOIN TblAlternateCategoryName
ON PxC.categoryid = TblAlternateCategoryName.categoryid AND TblAlternateCategoryName.feedid = @feedID
WHERE (
( Pro_Chl.parentid = '' )
AND ( Pro_Chl.id NOT IN (SELECT parentid
FROM TblProducts AS pc
WHERE ( customproperties LIKE '%upc%' )) )
AND ( Pro_Chl.status = 1 )
AND ( Pro_Chl.manufacturerid IS NOT NULL )
AND ( Pro_Chl.manufacturerid <> '' )
AND ( Pro_Chl.manufacturerid <> '- No Manufacturer -' )
AND ( Pro_Chl.id NOT IN (SELECT productid
FROM TblProductschoicecombinations
WHERE available = 0) )
AND Pro_Chl.manufacturerid NOT IN (
'f46c9a25-8172-49a8-991a-a8219663453b' )
)
OR
(
( Pro_Chl.parentid <> '' )
AND ( Pro_Chl.customproperties LIKE '%upc%' )
AND ( Pro_Chl.parentid IN (SELECT id
FROM TblProducts AS cp
WHERE ( status = 1 )
AND ( parentid = '' )) )
AND ( Pro_Chl.status = 1 )
AND ( Pro_Chl.manufacturerid IS NOT NULL )
AND ( Pro_Chl.manufacturerid <> '' )
AND ( Pro_Chl.manufacturerid <> '- No Manufacturer -' )
AND ( Pro_Chl.id NOT IN (SELECT productid
FROM TblProductschoicecombinations
WHERE available = 0) )
AND Pro_Chl.manufacturerid NOT IN (
'f46c9a25-8172-49a8-991a-a8219663453b'
)
)