【问题标题】:Display Value from Sub Query in SELECT在 SELECT 中显示来自子查询的值
【发布时间】:2021-02-22 05:58:17
【问题描述】:

我需要在 SELECT 中显示值 MIN(pa.DataAdjudicacao)。 以及如何替换此子查询以进行联接? 我该怎么做? 据我搜索,我还没有找到任何方法来做到这一点。 请帮忙。

SELECT p.id, p.referencia
FROM PCTSproposta p
WHERE p.ID in (SELECT pa.Proposta
            FROM PropostaAdjudicada pa
            WHERE pa.Proposta = p.ID
            GROUP BY pa.Proposta
            HAVING MIN(pa.DataAdjudicacao) >= '2020-10-01' And MIN(pa.DataAdjudicacao) <= '2020-10-31')

【问题讨论】:

    标签: sql sql-server subquery inner-join lateral-join


    【解决方案1】:

    您的查询过于复杂。 您使用子查询通过IN 谓词过滤数据,但选择您已传递给子查询过滤器的相同ID。所以你的IN 看起来像EXISTS。 但是如果你需要那个最小值,你应该使用JOIN:

    SELECT p.id,
      p.referencia,
      pa2.DataAdjudicacao
    FROM PCTSproposta p
      JOIN (
        SELECT pa.Proposta,
          MIN(pa.DataAdjudicacao) as DataAdjudicacao
        FROM PropostaAdjudicada pa
        GROUP BY pa.Proposta
        HAVING MIN(pa.DataAdjudicacao) BETWEEN date '2020-10-01'AND date '2020-10-31'
      ) pa2
        on pa2.Proposta = p.ID
    
    

    根据Id列的角色(如果是PCTSproposta的主键)、数据完整性和基数,子查询可以合并到主查询中:

    SELECT p.id,
      p.referencia,
      MIN(pa.DataAdjudicacao) as DataAdjudicacao
    FROM PCTSproposta p
      JOIN PropostaAdjudicada pa
        on pa2.Proposta = p.ID
    GROUP BY p.id,
      p.referencia
    HAVING MIN(pa.DataAdjudicacao) BETWEEN date '2020-10-01'AND date '2020-10-31'
    

    【讨论】:

    • 我真的很喜欢这个解决方案,但我必须将选择的列放在组中(我的意思是来自 PCTSproposta 的列)
    • 我会选择你的第一个选项,对我来说似乎是最好的,非常感谢,学习了
    • @JSantos.PCTS 我已经更新了我的代码。但这真的取决于。例如,如果您在PCTSproposta 中有 10 行从该表的 100000 行中从PropostaAdjudicada 中选择了 100 行对应(未分组)行,那么它可以有意义。我没有测试查询计划以检查 Oracle 是否会将 Proposta 列上的过滤器推送到子查询中。在这种情况下,GMB 的横向连接版本也可以提高性能(例如使用索引访问)。
    • 好吧,我在 PCTSproposta 中有超过 5000 行,在 PropostaAdjudicada 中有近 1000 行,所以我认为这其中的任何一个都会表现良好,或者不会?
    【解决方案2】:

    想到横向连接:

    SELECT p.id, p.referencia, pa.*
    FROM PCTSproposta p
    CROSS APPLY (
        SELECT MIN(pa.DataAdjudicacao) minDataAdjudicacao
        FROM PropostaAdjudicada pa
        WHERE pa.Proposta = p.ID
    ) pa
    WHERE pa.minDataAdjudicacao >= '20201001' AND pa.minDataAdjudicacao < '20201101'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2020-11-01
      • 1970-01-01
      相关资源
      最近更新 更多