【问题标题】:How could I rewrite a query without using joins如何在不使用联接的情况下重写查询
【发布时间】:2009-04-15 16:52:52
【问题描述】:

我想知道如果不使用连接,这个查询将如何编写。我一直在尝试找出连接不可行或无法使用(不可用)的情况。

SELECT
    *
FROM
(
    table1
INNER JOIN
    table2
ON
    table1.id = table2.id
)
INNER JOIN
    table3
ON
(
    table1.id2 = table3.id2
)
AND
(
    table1.id3 = table3.id3
)
WHERE
    table1.id = 1

我不能使用联接的原因是因为应用程序使用 HQL 而不是标准 SQL,而 HQL 使联接非常难以执行。

【问题讨论】:

  • 在什么情况下连接不可用或不可行?
  • 我同意布拉德的观点,您为什么认为加入不可用或不可行?
  • HQL 使得除了交叉连接之外的任何连接都很难实现。因此,我希望避免它们。
  • 如果这是问题,最好避免 HQL,因为您的工具不支持核心功能。
  • 我真希望我能给 cmets 投票...

标签: sql inner-join


【解决方案1】:

如果不以一种或另一种方式连接它们,就不可能从两个不同的表中提取数据。您正在使用 JOIN 语句,但您可以通过将其放在 where 子句中来实现相同的目的,例如:

SELECT * FROM table1, table2 WHERE table1.id = table2.id AND ...

【讨论】:

  • 这不是不可能的,我相信它只是一个笛卡尔积。笛卡尔的东西或其他。即从table1,table2中选择*
  • 这仍然是一个连接。仅仅因为它没有“加入”这个词并不意味着它不是一个。
  • @Darren,这仍然被认为是一个连接(交叉连接)
  • 有时,您可以通过 UNION 组合来自两个表的数据。 UNION 真的不是一个连接。然而,UNION 是正确工具的情况类别和 JOIN 是正确工具的情况类别几乎是不相交的。
【解决方案2】:

您可以在应用程序中进行分离的选择和连接。

【讨论】:

    【解决方案3】:

    如果连接不受限制,请远离 SQL 数据库。

    【讨论】:

      【解决方案4】:

      如果只选择 1 个值,通常子查询可能比连接更容易

      SELECT e.Name, e.HireDate, (select SUM(CheckAmount) from EmployeeCheck where EmployeeID = e.ID) 
      FROM Employee e
      

      【讨论】:

        【解决方案5】:

        不要成为纯粹主义者,但关系数据库和数据规范化的核心概念是连接。如果没有这个,几乎没有理由使用关系数据库来存储数据。索引可以快速有效地实现这一点。

        旧方法是使用主表和事务表。回到黑暗时代。

        但是,您可以使用游标来执行连接所执行的过滤。游标的作用类似于针对表的数组,而不是执行基于连接的过滤器,并且会得到相同的结果。

        【讨论】:

          【解决方案6】:

          如果需要,您可以使用相关子查询来实现,但连接更好。

          【讨论】:

            【解决方案7】:

            如果您的休眠映射文件中有关联映射,休眠不会阻止您执行连接。参见,例如:http://www.jumpingbean.co.za/blogs/mark/hibernate_hql_inner_join_on_clause

            【讨论】:

              【解决方案8】:

              没有连接的 SQL...

              SELECT * FROM table1
              SELECT * FROM table2
              SELECT * FROM table3
              

              但这对你没有帮助。

              问题是,你想要的输出是什么,你有什么理由不想加入?

              如果您想要来自关系数据库中多个表的数据,那么您将连接数据。正如 James Black 所建议的,也许这是您需要在应用程序中执行的操作。

              如果您能进一步了解情况,我们或许可以提供更多帮助。

              【讨论】:

                猜你喜欢
                • 2022-01-03
                • 1970-01-01
                • 2014-06-06
                • 1970-01-01
                • 2021-03-13
                • 1970-01-01
                • 2018-04-23
                • 2012-02-25
                • 1970-01-01
                相关资源
                最近更新 更多