使用SQL Server返回自定义结果

使用SQL Server返回自定义结果,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这有点复杂,所以我要把它分解一下。我正在尝试获取结果,但无法确定查询将是什么样子。前提是,一个用户已经购买了一套特定的物品,他们的装备。当他们访问我的网站时,他们会看到用户提交的工具包或设置。我只想向他们展示他们购买的装备。他们不需要看到他们没有的装备设置。我希望这是有道理的。我的桌子是这样的: [Gear] gearID是唯一的键 有所有装备(话筒、头部、效果)的列表,每个装备都有唯一的id [Kits] kitID是唯一的键 具有用户提交的所有工具包的列表 [KitGearLink]

这有点复杂,所以我要把它分解一下。我正在尝试获取结果,但无法确定查询将是什么样子。前提是,一个用户已经购买了一套特定的物品,他们的装备。当他们访问我的网站时,他们会看到用户提交的工具包或设置。我只想向他们展示他们购买的装备。他们不需要看到他们没有的装备设置。我希望这是有道理的。我的桌子是这样的:

[Gear]

  • gearID
    是唯一的键
  • 有所有装备(话筒、头部、效果)的列表,每个装备都有唯一的id
[Kits]

  • kitID
    是唯一的键
  • 具有用户提交的所有工具包的列表
[KitGearLink]

此表将
[Kits]
[Gear]
相互连接。这张表列出了用户提交的装备

[用户]

  • userID
    是唯一的键
  • 所有用户的列表
[UserGear]

将[users]和[gear]表链接在一起。这是存储用户的个人装备的内容

那么,我如何为每个用户调出记录,向他们展示所有与他们拥有的装备配合使用的套件。如果一个工具包有用户不拥有的东西,那么它就不会显示它们。有什么想法吗


谢谢大家

可能是这样的:

SELECT *
FROM Kit k
WHERE k.KitID NOT IN (
    SELECT DISTINCT kg.KitID
    FROM KitGearLink kg
    LEFT JOIN (
       SELECT ug0.GearID
       FROM UserGear ug0
       WHERE ug0.UserID = @userParam
    ) ug ON kg.GearID = ug.GearID
    WHERE ug.GearID = null
)
对于给定的用户id,子查询返回未能通过gear id的kit,将用户和kit(带有一点用户没有的gear的kit)连接起来。这用于过滤系统中的套件列表


编辑:引入第二个子查询,在左连接发生之前按用户id参数过滤用户装备,请参阅注释。

好的,您需要一个装备列表,其中装备中的所有装备在某一点上都与特定用户相关联。最好的选择是通过SP并使用内存表。这假设您正在为特定用户请求工具包。您可以获得所有用户的完整列表,但成本更高且更复杂

DECLARE @UserId as int
SELECT @Userid = YOURUSER

Declare @tblUserKits TABLE (
    UserId int null, 
    KitId int null, 
    GearId int null
    )

-- GET ALL KITS THAT A USER HAS AT LEAST ONE PART OF
Insert Into @tbluserkits
    select distinct u.userid, k.kitid, k.gearid
    from usergear u
    inner join Kitgearlink k on u.gearid = k.gearid
    where u.Userid = @UserId

-- DELETE ALL KITS THAT THE USER IS MISSING A PART FOR
Delete from @tblUserKits WHERE KitId in 
    (select distinct t.kitid
    from @tbluserkits t
    inner join kitgearlink k on t.kitid = k.kitid
    left outer join usergear u on k.gearid = u.gearid
    WHERE u.gearid is null)

-- Finally return a list of kits
Select distinct KitId from @tblUserKits

刚刚意识到这将不起作用,因为如果加入失败,用户ID将为空-我将继续考虑这个问题!