【问题标题】:Combine SQL query with JOIN and conditionals将 SQL 查询与 JOIN 和条件结合起来
【发布时间】:2020-06-08 12:17:57
【问题描述】:

我正在尝试组合查询、连接和条件。我检查了一些类似的问题(12),但仍然无法正常工作。

SELECT col1, col2, col3
FROM T1
LEFT JOIN (SELECT colx, coly, colz
FROM T2
WHERE colz = 1) ON col1=coly

我正在尝试将 T1 与 T2 与 col1=coly 一起加入其中 colz=1。每张表有100列,我只需要col1, col2, col3colx, coly, colz

此外,这种方法效率最高吗?

【问题讨论】:

  • 提供样本数据和期望的结果。我们无法猜测您要做什么。
  • 解释“不工作”是什么意思。如果您没有从第二个表中选择任何列,为什么要使用 left join
  • @GordonLinoff 我刚刚添加了一个解释。我没有这样做,因为我认为它是明确的。你的意思是我没有从 T2 中选择任何列?因为我从 T2 中选择 colx、coly 和 colz。
  • 您应该使用的简化版本:SELECT col1, col2, col3, colx, coly, colz FROM T1 LEFT JOIN T2 ON T1.col1=T2.coly and T2.Colz=1 这没有给出预期的结果吗?您收到的错误消息/输出是什么?
  • @Chris 如果您只想返回 T1 中的列,为什么要加入?左连接将返回 T1 的所有行,因此您可以只使用 select col1, col2, col3 from T1

标签: mysql sql sql-server


【解决方案1】:

你应该把这个查询写成:

SELECT t1.col1, t1.col2, t1.col3
FROM T1;

我认为JOIN 没有任何理由。它只能复制结果集中的行,这通常是不希望的。

这应该适用于任何数据库。

如果你有内部连接,我会推荐exists

SELECT t1.col1, t1.col2, t1.col3
FROM T1
WHERE EXISTS (SELECT 1
              FROM T2
              WHERE t2.colz = 1 AND t1.col1 = t2.coly
             );

【讨论】:

  • 当您说“应该”时,[这些天] 是否有明确的(例如性能)原因?此外,EXISTS 表单是否会为 JOIN 表单提供不同的结果集(如果存在笛卡尔积,则连接可能会产生更多行 [这可能是需要的])?
  • @CaiusJard 。 . .不完整的想法。我改变了答案。
【解决方案2】:

为了语法正确,您的子查询需要一个别名。始终使用别名表名并在选择中完全限定它们,除非它们是单个表子查询(在这种情况下,您可以不使用别名但建议这样做)

SELECT t1.col1, t1.col2, t1.col3
FROM table1 t1
LEFT JOIN 
(SELECT t2.coly FROM table2 t2 WHERE t2.colz = 1) sub1 ON t1.col1=sub1.coly

如果将与现有列同名的新列添加到查询中使用的表中,则别名建议可确保您的查询继续工作。如果没有别名,现在唯一的列将来可能会变得不明确。子查询中也可能出现差异,因为子查询可以访问外部列。删除子查询使用的列,但将同名的列添加到外部表中,可能会导致模糊的错误。查询仍在运行,但子查询开始从错误的位置提取数据

【讨论】:

  • 这里只是提一下,因为他说这是他的答案。连接根本没有被使用,对最终结果集绝对没有任何作用。这只是浪费cpu时间。
【解决方案3】:

你可以试试这个:

SELECT T1.col1, T1.col2, T1.col3, T2.colx, T2.coly, T3.colz 
FROM T1 LEFT JOIN T2 
   ON T1.col1=T2.coly and T2.Colz=1

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2021-11-24
    • 2015-05-19
    相关资源
    最近更新 更多