【问题标题】:Get Record only if its Join record exists in other table仅当其 Join 记录存在于其他表中时才获取记录
【发布时间】:2014-02-26 17:12:56
【问题描述】:

我有两个用于组和类别的表,我想返回组和类别,不包括那些没有任何类别的组,这里是我写的 SQL:

SELECT 
    cat_group.subject as group_name , spcat . *
FROM
    special_event_groups AS cat_group
        LEFT JOIN
    special_event_categories AS spcat ON cat_group.id = spcat.group_id
        AND cat_group.partner_id = spcat.partner_id;

它返回我没有任何类别的具有 NULL 值的组记录。我需要使用子查询吗?

【问题讨论】:

  • LEFT JOIN改成JOIN?
  • 是的,将左连接更改为连接或内连接(尽管它们是相同的)
  • @piotrekkr 非常感谢朋友们的帮助!你们中的任何人都可以添加这个作为答案,以便我可以标记它吗?
  • 如果您不熟悉JOIN 语法,我发现Venn Diagram representations of joins 之类的内容非常有助于获得基本理解。 Martin Smith's answerCade Roux's answer 都很好地解释了维恩图的局限性/缺点,并提供了有趣的响应和替代方案。这些是学习更多关于 SQL 连接的相当不错的资源。
  • 你也可以使用OUTER LEFT JOIN,LEFT JOIN,JOIN,这取决于你的数据库版本

标签: mysql sql join


【解决方案1】:

你需要做的是将LEFT JOIN改为JOIN

SELECT 
    cat_group.subject as group_name , spcat . *
FROM
    special_event_groups AS cat_group
JOIN
    special_event_categories AS spcat ON cat_group.id = spcat.group_id
    AND cat_group.partner_id = spcat.partner_id;

如果不满足加入条件,LEFT JOIN 显示来自special_event_groups 的行,并在来自special_event_categories 的选定列中附加NULL 值。另一方面,JOIN 在不满足 JOIN 条件时永远不会返回行。您可以阅读@MrMoose 评论了解更多信息。

【讨论】:

    【解决方案2】:

    你也可以使用OUTER LEFT JOINLEFT JOINJOIN,这取决于你的数据库版本。

    试试这个:

    SELECT 
        cat_group.subject as group_name , spcat . *
    FROM
        special_event_groups AS cat_group
           // LEFT JOIN, OUTER LEFT JOIN, JOIN
        special_event_categories AS spcat ON cat_group.id = spcat.group_id
    WHERE cat_group.partner_id IS NULL;
    

    让我知道它是否有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 2019-11-22
      • 1970-01-01
      • 2022-01-22
      • 2022-01-08
      • 2019-11-26
      • 2021-04-01
      相关资源
      最近更新 更多