【问题标题】:Convert multiple sub-queries to on join [closed]将多个子查询转换为 on join [关闭]
【发布时间】:2015-11-14 03:25:53
【问题描述】:

我的 sql 中有多个子查询

SELECT *, 
(SELECT Col1 FROM MYTABLE2 WHERE SAME) AS Col1,
(SELECT Col2 FROM MYTABLE2 WHERE SAME) AS Col2,
(SELECT Col3 FROM MYTABLE2 WHERE SAME) AS Col3,
(SELECT Col4 FROM MYTABLE2 WHERE SAME) AS Col4,
FROM MYTABLE1 WHERE XXX 

如何将其转换为一个 JOIN?子查询相同,只是选择列名不同。

【问题讨论】:

  • 这两个表有什么关系? where 子句有什么作用? subqs 中的条件是否与外部 q 相同?
  • 您能否将SAME 扩展为查询中使用的实际代码?
  • 子查询相同,只是选择列不同。 @MarkBannister

标签: sql sql-server tsql


【解决方案1】:
SELECT MYTABLE1.*, MYTABLE2.*
  FROM MYTABLE1 
  LEFT OUTER JOIN MYTABLE2  
    ON same 
 WHERE XXX 

ON 不必关联两个表
这更像是一个过滤的交叉连接

【讨论】:

  • 要么。取决于你想要什么。如果同样不返回任何行,并且您想要 MYTABLE1 然后是外部的。
【解决方案2】:
SELECT t1.*, t2.col1, t2.col2, t2.col3, t2.col4
FROM MYTABLE1 T1
INNER JOIN MYTABLE2 T2 
ON T1.somecol = T2.somecol --replace with appropriate join condition
WHERE XXX 
and --same conditions as previous (WHERE SAME)

这就是你要做的。您应该根据 cmets in-line 进行所需的更改。

【讨论】:

  • 如果 T2 不匹配怎么办
  • 你到底是什么意思?
  • 如果 T1.somecol T2.somecol
  • @user960567 - 如果您知道 WHERE 子句中的条件只会产生恰好一个记录,则可以使用CROSS JOIN。不过要小心,这听起来像你有一个设计问题(在关系数据库中加入没有明确关系的表是一种代码味道,CROSS JOIN 可能会使问题爆发。)
  • 如果 table1 与 table2 没有某种关联,那么查询的目的是什么?没有东西可以加入,为什么要问怎么加入?
【解决方案3】:

也许您应该使用 UNION 而不是 JOIN?

【讨论】:

  • 这应该是一条评论。
  • 是的,但我没有足够的声誉来发表评论:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多