Sql server 与条件逻辑抗争
编辑问题: 我似乎无法理解我的查询的条件逻辑 我确信这很简单,但我已经在这上面转了太久了——这只是其中的一天 任何帮助都会得到感激 当前查询:Sql server 与条件逻辑抗争,sql-server,tsql,ssms,Sql Server,Tsql,Ssms,编辑问题: 我似乎无法理解我的查询的条件逻辑 我确信这很简单,但我已经在这上面转了太久了——这只是其中的一天 任何帮助都会得到感激 当前查询: SELECT r.WidgetPK ,r.WidgetName ,r.WeightRateFlag [WeightRateFlag] ,r.Rate [Rate] ,r.Breakpoint
SELECT
r.WidgetPK
,r.WidgetName
,r.WeightRateFlag [WeightRateFlag]
,r.Rate [Rate]
,r.Breakpoint [Breakpoint]
,MAX(ISNULL(f.ShippingFee,0)) [ShippingFee]
,MAX(ISNULL(f.OtherFee,0)) [OtherFee]
,MAX(r.weight) [Weight]
FROM
#Rates r
LEFT JOIN #Fees f ON f.WidgetPK = r.WidgetPK
为了简单起见,我把这一组删去了
如果每个WidgetPK的任何行中的WeightRateFlag中都有1,则不会返回所有带0的行。如果WeightRateFlag中没有包含1的行,则将返回所有行
抱歉,原来的问题不清楚-搜索没有帮助,我问了一位同事。我想我的问题可能只是我在这里和搜索中问了一个错误的问题。看起来有点复杂,但是CTEs非常有用。另外,它们应该与优化器配合得很好。为所需的列进行修改
SELECT
r.WidgetPK
,r.WidgetName
,r.WeightRateFlag [WeightRateFlag]
,r.Rate [Rate]
,r.Breakpoint [Breakpoint]
,MAX(ISNULL(f.ShippingFee,0)) [ShippingFee]
,MAX(ISNULL(f.OtherFee,0)) [OtherFee]
,MAX(r.weight) [Weight]
FROM
#Rates r
LEFT JOIN #Fees f ON f.WidgetPK = r.WidgetPK
WHERE r.WeightRateFlag = 1
UNION ALL
SELECT
r.WidgetPK
,r.WidgetName
,r.WeightRateFlag [WeightRateFlag]
,r.Rate [Rate]
,r.Breakpoint [Breakpoint]
,MAX(ISNULL(f.ShippingFee,0)) [ShippingFee]
,MAX(ISNULL(f.OtherFee,0)) [OtherFee]
,MAX(r.weight) [Weight]
FROM
#Rates r
LEFT JOIN #Fees f ON f.WidgetPK = r.WidgetPK
WHERE r.WeightRateFlag = 0
AND NOT EXISTS (SELECT * FROM #rates r2 WHERE r2WeightRateFlag =1 AND r.WidgetName = r2.WidgetName)
/* TEST DATA SETUP */
IF OBJECT_ID(N'tempdb..#t1') IS NOT NULL
BEGIN
DROP TABLE #t1
END
CREATE TABLE #t1 (WidgetPK int, col1 varchar(19), WeightRateFlag bit, ShippingFee money, OtherFee money, [Weight] int);
INSERT INTO #t1 (WidgetPK, col1, WeightRateFlag, ShippingFee, OtherFee, [Weight])
VALUES
(1, 'showme1', 1, 9, 1, 1)
, (1, 'noshow2', 0, 2, 9, 2)
, (1, 'noshow3', 0, 1, 2, 9)
, (2, 'showme1', 1, 9, 9, 9)
, (3, 'showme1', 0, 1, 9, 1)
, (3, 'showme2', 0, 9, 9, 9)
, (3, 'showme3', 0, 9, 1, 9)
;
/* QUERY STARTS HERE */
WITH cte1 AS (
SELECT x1.*
FROM (
SELECT #t1.WidgetPK, #t1.col1, #t1.WeightRateFlag, #t1.ShippingFee, #t1.OtherFee, #t1.[Weight]
, RANK() OVER (PARTITION BY #t1.WidgetPK ORDER BY #t1.WeightRateFlag DESC) AS rn
FROM #t1
) x1 WHERE x1.rn = 1
)
, cte2 AS (
SELECT cte1.WidgetPK
, MAX(cte1.ShippingFee) AS ShippingFee
, MAX(cte1.OtherFee) AS OtherFee
, MAX(cte1.[Weight]) AS [Weight]
FROM cte1
GROUP BY cte1.WidgetPK
)
SELECT cte1.WidgetPK, cte1.col1, cte1.WeightRateFlag, cte2.ShippingFee, cte2.OtherFee, cte2.[Weight]
FROM cte1
LEFT OUTER JOIN cte2 ON cte1.WidgetPK = cte2.WidgetPK
;
请包括一个IE、输入、预期输出和查询到目前为止,并标记RDBMS平台。考虑使用一个联合所有,第一个查询得到1个,第二个查询不包含其中任何一个都有A的记录。1@HLGEM联合所有是什么让我到这一点,费率临时表是联合其他两个表。我没有创建表,也没有编辑能力。大多数WidgetPK都在联盟的第一个表中,少数在第二个表中,但如果他们在第二个表中,他们也在第一个+1表中,这是有效的-我可能需要对它进行微调,因为它的性能受到了影响,但这是在正确的轨道上。很可能你可以在如何创建费率方面做类似的事情。或者,也可以为临时表编制索引。