是否有正确的方法利用 SQL UNION 来从三个潜在查询中选择最大值?

问题描述 投票:0回答:1

我正在用 SQL 编写一个存储过程,作为其中的一部分,我需要选择三个潜在值(需求、平均值和预测)中的最大值。我有查询来查找每个值,但我想知道以下哪个选项是最佳实践:

选项 1:将所有三个查询选择到临时表中,然后使用 CASE WHEN 语句为每行选择三个查询中的最大值。

选项 2:使用 UNIONS 将三个查询合并到一个总体选择语句中。

我什至不知道选项2是否可行,所以如果不可行,那么我只会使用临时表,但我无法想象这是编写我想要的内容的最有效方式。因为我在存储过程中使用它,所以我很难选择测试材料来尝试代码,因此我将不胜感激有关最佳编写实践的任何建议,以及如果在测试过程时它不起作用我可以在这里用更具体的代码提出另一个问题。

选项 1:(我知道这段代码可以工作,但它似乎太复杂,不是最有效的选项)

SELECT Plant, Material, Dmd
INTO #T1
FROM Table1

SELECT Plant, Material, Avg
FROM #T2
FROM Table2

SELECT Plant, Material, Fcst
INTO #T3
FROM Table3

SELECT a.Plant, 
       a.Material, 
       CASE WHEN Dmd > Avg AND Dmd > Fcst THEN Dmd ELSE
       CASE WHEN Avg > Fcst THEN Avg ELSE Fcst END END as 'Output'
FROM #T1 a INNER JOIN
     #T2 b on a.Plant = b.Plant AND a.Material = b.Material INNER JOIN
     #T3 c on a.Plant = c.Plant AND a.Material = c.Material

选项2:(在我看来,这在逻辑上应该可行,但我之前没有必要写过这个,所以我不知道它有多实用)

SELECT a.Plant,
       a.Material,
       CASE WHEN Dmd > Avg AND Dmd > Fcst THEN Dmd ELSE
       CASE WHEN Avg > Fcst THEN Avg ELSE Fcst END END as 'Output'
FROM 
(SELECT Plant, Material, Dmd
FROM Table1) a
UNION
(SELECT Plant, Material, Avg
FROM Table2) b
UNION
(SELECT Plant, Material, Fcst
FROM Table3) c

如果有帮助的话,我的输入表中的条目应该都是相同工厂和材料的不同订购数量,所以我知道每个查询中的唯一条目将是相同的工厂和材料,只要我的 Table1、Table2 和Table3 并连接到输入表。

编辑: 表 1、2 和 3 中可能包含的内容以及所需输出的示例: (如果格式错误请见谅,我正在努力)

表1(工厂、材料、Dmd)

1000   x   3

表2(植物、材料、平均值)

1000   x   6

表3(工厂、材料、Fcst)

1000   x   4.5

期望输出(工厂、材料、输出)

1000   x   6
sql sql-server subquery union temp-tables
1个回答
0
投票

您可以使用 UNION 执行此操作,然后使用它作为子查询来选择最大值,例如

select max(v) from
(
    select Dmd as v from Table1
    union
    select [Avg] as v from Table2
    union
    select Fcst as v from Table3
) src;

或者你可以使用 INNER JOINS - 如果你正在寻找每个植物/材料的最大值,使用一个巧妙的技巧将各种值放入子查询中,例如,它将更好地处理这个问题

select a.Plant,a.Material, 
(
    SELECT Max(v) FROM 
    (VALUES (Dmd), ([Avg]), (Fcst)) AS valuestable(v)
) as [MaxV]
from @Table1 a
INNER JOIN @Table2 b ON a.Plant = b.Plant and a.Material = b.Material
INNER JOIN @Table3 c ON a.Plant = c.Plant and a.Material = c.Material;
© www.soinside.com 2019 - 2024. All rights reserved.