使用SQL Server返回自定义结果

时间:2013-05-02 15:18:18

标签: sql sql-server sql-server-2008

这有点复杂,所以我要打破它。我试图得到结果,但无法弄清楚查询会是什么样子。前提是,用户购买了一套特定的物品,他们的装备。当他们访问我的网站时,他们会看到用户提交的工具包或设置。我只想向他们展示只有他们购买过的装备的设置。他们不需要看到他们没有的装备设置。我希望这是有道理的。这是我的表格的样子:

[Gear]

  • gearID是唯一键
  • 列出了每个
  • 的唯一ID的所有装备(麦克风,头部,效果)

[Kits]

  • kitID是唯一键
  • 列出了所有用户提交的工具包

[KitGearLink]

此表格将[Kits][Gear]相互关联。因此,这是列出用户提交的工具包装备的表格。

[Users]

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

[UserGear]

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

那么我如何为每个用户提取记录,向他们显示所有可以使用它们的装备的套件。如果套件具有用户不拥有的东西,则它不会显示它们。有任何想法吗?

谢谢你们!

2 个答案:

答案 0 :(得分:1)

也许是这样的:

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,子查询返回套件,这些套件在用户和套件之间连接齿轮ID失败(套件具有用户没有的齿轮)。这用于过滤系统中的套件列表。

修改:引入第二个子查询,以便在左连接发生前按用户ID参数过滤用户设备,请参阅注释。

答案 1 :(得分:0)

好的,您需要一个工具包列表,其中套件中的所有齿轮在某些时候都与特定用户相关联。最好的办法是通过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