【问题标题】:Modifying sql query,dont want to use join operation修改sql查询,不想使用join操作
【发布时间】:2010-11-18 08:04:37
【问题描述】:

以下查询使用连接操作,我希望在不使用连接操作的情况下执行相同的查询。有可能这样做吗?如果是,我该怎么做?

select jname, jcode from heardt inner join judge ON heardt.jud1 = jcode

我尝试这样做的原因是因为我正在为 mysql 使用 odbc 连接,并且连接操作根本没有执行,因为网页加载无限长并且没有给出任何输出。这就是为什么我想尝试不使用连接操作的原因

【问题讨论】:

  • 这两张表的方案是什么?
  • 不使用join的目的是什么?
  • 您能否发布带有命令和连接的 C# 代码,以便我们更好地帮助您?

标签: c# asp.net sql mysql


【解决方案1】:

我不知道你的理由,我发现 JOINS 更容易阅读,但你可以通过在 where 子句中加入(没有双关语)表来替换它们。

select  jname
        , jcode 
from    heardt 
        , judge 
where   heardt.jud1 = judge.jcode

【讨论】:

  • 我正在为 mysql 使用 odbc 连接,并且连接操作没有被执行,因为网页无限长地加载并且没有给出任何输出。这就是为什么我想尝试不使用连接操作的原因
  • @Ishan,我对 ODBC 连接了解不多,但在我看来,通过 ODBC 连接进行的 JOIN 操作不太可能是您的性能问题的罪魁祸首。
  • 此语法在 SQL 中调用连接,它不会从逻辑中删除连接。
  • @Blue,我认为 OP 是在谈论删除 JOIN operator,而不是 operation
  • @Lieven,他在问题中确实多次提到了操作。
【解决方案2】:

该查询没有额外的过滤器。它可能会导致查询返回许多行。这可能会导致速度变慢,具体取决于表中的记录数。

您应该考虑限制从查询返回的记录数。

如果 JCode 字段上有索引,您需要检查的其他内容

【讨论】:

    【解决方案3】:
    Select jname, jud1 from heardt where not jud1 is null
    

    编辑:好的,这很快。那么:为什么需要“加入”?

    【讨论】:

    • 我假设 jname 是法官表中的一列。如果不是,那么一开始就没有理由加入这些表。 OP 可能想澄清这一点。
    【解决方案4】:

    查询Select jname, jud1 from heardt where not jud1 is null 表明 jud1 有一个值,但不是那个值是有效的。 join 或 where 验证表之间的关系。

    如果您的查询需要很长时间才能在连接到位的情况下执行,则很可能您的表上没有正确的索引,导致发生表扫描而不是索引搜索。

    【讨论】:

      【解决方案5】:

      我正在为 mysql 使用 odbc 连接,并且连接操作没有被执行,因为网页正在无限长地加载并且没有给出任何输出。这就是为什么我想尝试不使用连接操作的原因

      这可能不是因为您的JOIN 没有被执行,而是因为您的JOIN 查询花费了太长时间。 那是可能是因为您没有定义正确的索引(judge.jcode 上的索引,最好是聚集索引)。

      如果在添加此类索引后连接仍然需要很长时间,您可以考虑使用表或索引视图预缓存查询(不过是 not supported in MySQL)。

      【讨论】:

        【解决方案6】:

        如果您能够运行 SQL 管理器,您应该能够在 ODBC 连接上运行它,否则您在 C# 中实例化该连接的方式有问题。

        您能否发布您正在使用的 c# 代码,以便我们为您做出更好的判断答案。

        【讨论】:

          【解决方案7】:

          正如lieven指出的,我认为他的解决方案是一个很好的解决方案

          select  jname
                  , jcode 
          from    heardt 
                  , judge 
          where   heardt.jud1 = judge.jcode
          

          但是你应该在你加入的字段中创建索引,因此结果会很快提供,所以添加

          在heartt(jud1)上创建索引a1; 在judge(jcode)上创建索引a2;

          我认为这是更好的选择

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-04
            • 1970-01-01
            • 2018-11-24
            • 1970-01-01
            • 2012-11-04
            相关资源
            最近更新 更多