【问题标题】:Only join if field exists仅当字段存在时才加入
【发布时间】:2014-03-19 14:00:06
【问题描述】:

我有这两张桌子。

una

| id | word | desc |

匹配

| id | word | review |

una 有几千行,表 match 最终将具有与 una 相同的大小,但目前只有几行。

我想要的是SELECT una 中的所有行,但是,不要显示在 match 中也存在单词的行,并且设置为review = 0.

我需要使用IF EXISTS (....)吗?

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    你会想要 SQL 沿着这条线:

    SELECT * FROM una WHERE word IN (
      SELECT word FROM una
      MINUS
      SELECT word FROM match WHERE review = 0
    )
    

    更新:改进:

    SELECT * 
    FROM una 
    WHERE word NOT IN (
      SELECT word 
      FROM match 
      WHERE review = 0
    )
    

    【讨论】:

      【解决方案2】:
      select u.*
      from una u
           left join match m on u.word=m.word
      having m.word is null
      

      【讨论】:

      • 你想要WHERE 而不是HAVING。这称为反连接。
      • @MarcusAdams 好点,这将使查询运行,但结果不是 OP 要求的。
      • @RacilHilan,这对某些人来说是一个艰难的概念,但这不仅是一个解决方案,而且是更好的解决方案。反连接通常比子查询具有更好的性能。
      • @MarcusAdams 好的,如果您愿意,也许您可​​以向我们介绍这个概念,但这不是我的意思。无论性能如何,此查询都不会返回 OP 要求的内容。再次阅读问题和要求。 review = 0 要求去哪儿了?如果我在这里遗漏了一些东西,我深表歉意,但你正在辩论不满足要求的东西的性能。就目前而言,公认的答案是唯一正确的答案。
      • @RacilHilan,你现在才提到这个。很容易忽略或忘记这部分需求。清楚而不是害羞总是好的。
      【解决方案3】:
      SELECT *
      FROM una AS u
      WHERE u.word NOT IN (SELECT word FROM match)
      AND u.review = 0
      

      编辑 - 抱歉,这是针对 TSQL 的,我不知道它是否与 Mysql 相同。

      【讨论】:

      • 您没有使用任何 TSQL 特定的特性/功能,因此您的查询是纯 SQL 并将在所有数据库中运行。
      • 啊,太棒了,我想我会发表评论以防万一我被标记下来。
      • 但是,您忘记了 OP 要求的第二个条件,即review = 0。否则,您的答案可能已被接受,因为您是第一个发布它的人。
      • 干杯我刚刚注意到了。谢谢
      • 是的,但是您在错误的位置添加了它。只需将其移到括号内...啊,别忘了欣赏指导。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多