SQL Server - tsql加入/过滤问题

时间:2014-07-08 01:42:51

标签: sql sql-server tsql

可能是错误的标题,但我无法总结我想要做的很好的事情。这可能就是为什么我的谷歌搜索没有帮助。

我有Discounts的列表,以及TeamExclusiveDiscountsDiscountId, TeamId

的列表

我调用传入@TeamID (int)的存储过程。

我想要的是所有Discounts,除非他们在TeamExclusiveDiscounts并且没有TeamID匹配@TeamId

所以数据类似于

Discount

DiscountID     Name
-----------------------
1              Test 1
2              Test 2
3              Test 3
4              Test 4
5              Test 5

TeamExclusiveDiscount

DiscountID     TeamID
-----------------------
1              10
2              10
2              4
3              8

预期结果:

  • 搜索TeamID = 10我应该获得折扣1,2,4,5
  • 搜索TeamID = 5我应该获得折扣4,5
  • 搜索TeamID = 8我应该获得折扣3,4,5

我尝试了各种联接,或尝试更新临时表来设置是否允许折扣,但我似乎无法理解这个问题。

所以我在我的存储过程的T-SQL之后选择了正确的折扣(SQL Server)。谢谢!

3 个答案:

答案 0 :(得分:2)

SELECT D.DiscountID FROM Discounts D
   LEFT JOIN TeamExclusiveDiscount T
     ON D.DiscountID=T.DiscountID
WHERE T.TeamID=@TeamID OR T.TeamID IS NULL

SQLFIDDLE for TEST

答案 1 :(得分:1)

你可以尝试一下吗 - 它只会选择团队中有团队折扣记录的记录,或者根本不选择团队折扣记录。

SELECT * FROM Discounts D
WHERE 
EXISTS (
    SELECT 1 
    FROM TeamExclusiveDiscount T 
    WHERE T.DiscountID = D.DiscountID
    AND TeamID = @TeamID
)
OR
NOT EXISTS (
    SELECT 1 
    FROM TeamExclusiveDiscount T 
    WHERE T.DiscountID = D.DiscountID
)

答案 2 :(得分:1)

我喜欢将英文描述直接翻译成SQL(至少作为第一遍): “所有折扣除非他们在TeamExclusiveDiscounts中,并且没有TeamID匹配@TeamId。”

  SELECT * 
  FROM Discounts D   -- All Discounts
  WHERE D.DiscountID NOT IN   -- except if they're in TeamExclusiveDiscounts 
        (SELECT T.DiscountID
        FROM TeamExclusiveDiscount T 
        WHERE T.DiscountID NOT IN   -- and don't have TeamID matching @TeamId. 
            (SELECT Match.DiscountID
             FROM TeamExclusiveDiscount Match 
             WHERE Match.TeamID = @TeamID)
         )