【问题标题】:Select value from table only if exist in another仅当存在于另一个表中时才从表中选择值
【发布时间】:2015-05-11 00:37:50
【问题描述】:

我有两张桌子。

表一:

ID COLOR    
1  white 
2  red 
3  black 
4  blue 
5  yellow

表二:

ID COLOR    
1  white 
2  white 
3  red 
4  black 

输出应该是:

1 white
2 red
3 black

(排除第二个表中不存在的 2 个值 - 蓝色和黄色 + 排除第二个白色)。

我尝试了不同的 JOIN 和 EXIST 查询,但没有成功。谢谢。

【问题讨论】:

  • 两个同名的表。是不是严重违反了数据库基础?
  • inner join 会解决你的问题。
  • 我简化了我的代码。第一个表包含所有类别(ID,Cat),第二个表包含分配类别(ID,Title,...... Cat)。我只想输出(在循环中)那些有帖子且不为空的类别。
  • 该评论在这个问题的上下文中毫无意义。
  • 没关系,它有效,谢谢:)

标签: mysql


【解决方案1】:

where exists 适合这个。

select * 
  from t1
  where exists 
    (select 1
      from t2 where color = t1.color);

demo here

子查询是一个相关子查询(因为它引用来自另一个查询的值),因此它针对外部查询的每一行执行。所以所有内部查询需要做的就是检查外部查询(和第一个表)的颜色是否存在于第二个表中。

【讨论】:

  • 感谢演示 :)
  • 嗨,你能解决我的这个问题吗?我想澄清一件事,我想要和这个一样的东西,我以前从未做过,但让我问你这个,例如我有 3 张桌子; t1,t2,t3,我对它们进行了内连接,例如 t1.id 内连接 t2.id 内连接 t3.id 我在哪里 t1.id = 1 和 t2.id = 1 和 t3.id = 3 问题是如果任何表中存在唯一的 on ,则不返回任何结果。这个问题应该怎么做
  • 其他信息我仍然想选择或触发查询,即使它在其他表上不存在,这意味着我只会从 id 存在的表中选择
  • 听起来您想使用left join 而不是inner join。如需更多信息,请尝试提问
  • Where Exists is 是非常慢的查询,当我尝试它时花了 19 秒。相比之下,左连接要快得多,只需 0.85 秒。
【解决方案2】:
SELECT DISTINCT t1.* FROM t1 
INNER JOIN t2 ON t1.color = t2.color;

获得与@pala_相同的东西的另一种方式

【讨论】:

  • 我相信(如果我错了,请有人纠正我)而且效率更高,因为在连接上添加子句将减少要比较的记录数量,而不是比较两个表中的所有记录
  • 实际上,这个版本将强制使用临时表,这要归功于独特的 - where exists 版本不会。比较解释计划here
  • @dbinns66 。 . .不正确。 exists 版本应该更高效。它没有select distinct
  • 是的,看起来像。添加了 DISTINCT 以删除连接中包含的重复白色。可能是另一种方式?
  • @gordon - 我仍然相信存在会进行额外的全表扫描......它必须按照定义
猜你喜欢
  • 2021-04-02
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多