【问题标题】:SQL - How to put a condition for which table is selected without left joinSQL - 如何在没有左连接的情况下为选择表设置条件
【发布时间】:2018-03-07 11:06:23
【问题描述】:

我在表中有一个标志,其值(1 代表美国,2 代表全球)指示数据将在表 A 中还是在表 B 中。

一个可行的解决方案是左连接两个表;但是,这会显着减慢脚本的速度(从不到一秒到超过 15 秒)。

还有其他聪明的方法吗?相当于

 join TableA only if TableCore.CountryFlag = "US"
 join TableB only if TableCore.CountryFlag = "global"

非常感谢您的帮助。

【问题讨论】:

  • 您使用的是 MySQL 还是 MS SQL Server?
  • 您可以在您的问题中添加 DDL 和示例数据吗?目前还不是很清楚你在问什么。
  • 请将您的脚本添加到问题中
  • 为什么美国和全球有不同的表格?一个普通的就可以了,你就不会再有这个问题了。

标签: sql sql-server dbeaver


【解决方案1】:

您可以尝试使用这种方法:

-- US data
SELECT
    YourColumns
FROM
    TableCore
    INNER JOIN TableA AS T ON TableCore.JoinColumn = T.JoinColumn
WHERE
    TableCore.CountryFlag = 'US'

UNION ALL

-- Non-US Data
SELECT
    YourColumns -- These columns must match in number and datatype with previous SELECT
FROM
    TableCore
    INNER JOIN TableB AS T ON TableCore.JoinColumn = T.JoinColumn
WHERE
    TableCore.CountryFlag = 'global'

但是,如果结果仍然很慢,您可能需要检查 TableCore 表是否在 CountryFlag 和 JoinColumn 上有索引,以及 TableA 和 TableB 在 JoinColumn 上是否有索引。

【讨论】:

    【解决方案2】:

    基本结构是:

    select . . ., coalesce(a.?, b.?) as ?
    from tablecore c left join
         tablea a
         on c.? = a.? and c.countryflag = 'US' left join
         tableb b
         on c.? b.? and c.counryflag = 'global';
    

    此版本的查询可以利用tablea(?)tableb(?) 上的索引。

    如果您有一个复杂的查询,这部分可能不是性能问题的原因。

    【讨论】:

      猜你喜欢
      • 2014-10-08
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多