【问题标题】:Filtering on a joined table but also including data where the joined & filtered table is empty?过滤连接表,但还包括连接和过滤表为空的数据?
【发布时间】:2013-03-07 18:13:12
【问题描述】:

我有一个包含用户信息的表格和一个包含标签信息的表格。标记表基本上具有标记类型、用户 ID 和标记值。我根据 UserID 加入了这两个表。

现在我想用 TagType = 1 的标签的值查询所有用户的列表。

SELECT [user].name, [tag].value
FROM user LEFT OUTER JOIN 
  tag ON user.id = tag.userid
WHERE [tag].type = 1

到目前为止,一切都很好。这很好用。

我现在遇到的问题是,我还希望在我的查询中看到没有标签类型 = 1 的标签的用户。在这种情况下,它应该只返回 NULL。目前,查询不会返回这些用户。

如果我去掉“WHERE [tag].id = 1”,那么它们会显示出来,但它会为每个用户返回几行 - 每个现有标签类型一个 - 但我不希望这样。

某种意义上我想得到:

Column 1: User Name
Column 2: Tag value of Tag Type 1 if it exists, otherwise NULL

我被困在那里。我不知道如何让其他用户加入,但将其他标签类型拒之门外。

【问题讨论】:

    标签: sql sql-server join tags


    【解决方案1】:

    将您的WHERE 条件放在JOIN 条件中。

    SELECT [user].name, [tag].value
    FROM user LEFT OUTER JOIN 
      tag ON user.id = tag.userid and [tag].type = 1
    

    【讨论】:

    • 非常感谢。奇迹般有效!我希望这很容易。
    • @MarcoK - 因为您已经有了LEFT JOIN,所以这是最合乎逻辑的解决方案。否则你会需要类似CASE 子句的东西。
    【解决方案2】:

    试试:

    SELECT [user].name, [tag].value
    FROM user LEFT OUTER JOIN 
      tag ON user.id = tag.userid AND [tag].type = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-24
      • 2010-10-13
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      相关资源
      最近更新 更多