在 1 中混合 3 个 sql 查询

Posted

技术标签:

【中文标题】在 1 中混合 3 个 sql 查询【英文标题】:Mixing 3 sql queries in 1 【发布时间】:2016-01-13 22:41:34 【问题描述】:

我有3张桌子如下

表1

Id Name
1   abcd
2   bcd
3   dabc

表2

Id2 Name2
2   xyz
3   def
4   mno

表3

Id  Id2  Value
1    4    1
2    3    1
3    4    1

现在,

从 table1 :我必须选择 Name 为 %abc% 的所有 Id 从 table2:我必须选择 Id2,其中 Name2 是“mno” 来自 Table3:我必须将值从 1 更改为 0,其中 Id 的值来自 Table1,Id2 来自 Table2。

表 1:

select Id from Table1 where Name like '%abc%'

表2:

select Id2 from Table2 where Name2 = "mno"

表 3:

update Table3 set Value = 0 where Id in() and Id2=

但是,我不知道如何使它成为 1 个单一查询。有人可以指导我吗?

【问题讨论】:

您应该查看连接查询"dev.mysql.com/doc/refman/5.7/en/join.html" 在此处加入漂亮的视觉辅助:blog.codinghorror.com/a-visual-explanation-of-sql-joins 【参考方案1】:

参考:prior stack article

你还没有解释 T1 与 T2 的关系,所以我假设了一个交叉连接。

每当您在 T1 中的数据中有名称为 '%abc%' (1,3) 的记录时.. 并且每当您在 T2 中有一条名称等于 'mno' 4 的记录时,您希望表 3 中的值为 0

所以我们生成的选择应该产生 1,4 3,4

当我们将其内部连接回表 3 时,它只选择

Id  Id2  Value
1    4    1
3    4    1

现在我们根据上面提供的链接中概述的此选择生成更新...

UPDATE table3 
INNER JOIN (
  SSELECT t1.ID t1ID, t2.id t2ID
  FROM table1 t1
  CROSS JOIN table2
  WHERE t1.name like '%abc%'
    and t2.name like = 'mno') B
 on B.t1ID = t3.Id 
and B.t2ID = T3.ID2
SET value = 0

给我们一个结果

Id  Id2  Value
1    4    0
2    3    1
3    4    0

if we select * from table3

【讨论】:

【参考方案2】:
update t3
set t3.Value = 0
from Table3 t3
inner join Table1 t1
  on t3.Id = t1.Id
inner join Table2 t2
  on t3.Id2 = t2.Id2
where t1.Name like '%abc%' and t2.Name2 = 'mno'

update Table3
set value = 0
where Id in (select Id from Table1 where Name like '%abc%')
and Id2 in (select Id2 from Table2 where Name2 = 'mno')

【讨论】:

注意,尽量避免使用 IN 子查询,而使用 EXISTS。参考:explainextended.com/2010/05/27/…谢谢 并非如此。阅读优化器dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html 的子查询优化【参考方案3】:

您应该考虑 UPDATE ... WHERE EXISTS 如下:

update Table3 set Value = 0 
WHERE EXISTS (SELECT 1 FROM Table1 where Name LIKE '%abc%' AND  Table1.Id=Table3.Id )
AND EXISTS (SELECT 1 FROM Table2 where Name2 = "mno" AND Table2.Id2=Table3.Id2)

【讨论】:

以上是关于在 1 中混合 3 个 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

查询 SQL + HDF5 混合

使用 Laravel Eloquent 和命名绑定的 SQL 查询:混合命名参数和位置参数

用dataframe重写sql查询;如何从选择中混合不同的来源

sql语句查询数据问题!

如何使用 Laravel 的流畅查询构建器混合原始 SQL 和非原始 SQL

SQL 查询在 WHERE CLAUSE 中执行更多记录