优化并减小联合选择查询的大小

问题描述

我的问题是关于如何优化和减少SQL查询的大小。我想使用UNION加入20多个查询,按照下面的逻辑,它给我正确的结果,但是我在这里寻找两件事

  • 更有效率的

  • 我的查询中已经有20个UNIONS,并且每个月我必须再增加2-4个UNIONS,这使得此查询很长,因此有什么方法可以用更少的代码来改写此查询

    logits = Multiply()([dense_output,input_2])
    initializer = tf.keras.initializers.Identity()
    masked_actions = Dense(num_actions,use_bias=False,trainable=False)(logits) #returns the same logits
    
    

    以此类推...

结果

 Select 
 '343' As 'Manual ID','24/07/2020' As 'Date',A.ID,O.Order_Name,C.Customer_Name,Q.Quantity
 From Shipper A
 Left Join Order O  A.ID = O.ID
 Left Join Customer C A.ID = C.ID
 Left Join Quantity Q Q.ID = C.ID
 where A.ID IN (1)

 UNION

 Select 
 '323' As 'Manual ID','24/08/2020' As 'Date',Q.Quantity
 From Shipper A
 Left Join Order O A.ID = O.ID
 Left Join Customer C A.ID = C.ID
 Left Join Quantity Q Q.ID = C.ID
 where A.ID IN(2,3,4)

解决方法

您可以尝试以下方法:

Select
 CASE
    WHEN A.ID IN(1) THEN '343'
    WHEN A.ID IN(2,3,4) THEN '323'
 END As 'Manual ID',CASE
    WHEN A.ID IN(1) THEN '24/07/2020'
    WHEN A.ID IN(2,4) THEN '24/08/2020'
 END As 'Date',A.ID,O.Order_Name,C.Customer_Name,Q.Quantity
 From Shipper A
 Left Join Order O  A.ID = O.ID
 Left Join Customer C A.ID = C.ID
 Left Join Quantity Q Q.ID = C.ID
 Where A.ID IN(1,2,4)
,

第一个建议是将参数移到另一个表中,然后对其进行联接。如果您不想使用真实的表格,甚至可以将其设为内联视图...

第二个建议是使用UNION ALL以避免UNION带来的重复数据删除费用。

SELECT
    params.*,Q.Quantity
FROM
(
              SELECT '343' As 'Manual ID','24/07/2020' As 'Date',1 AS A_ID
    UNION ALL SELECT '323' As 'Manual ID','24/08/2020' As 'Date',2 AS A_ID
    UNION ALL SELECT '323' As 'Manual ID',3 AS A_ID
    UNION ALL SELECT '323' As 'Manual ID',4 AS A_ID
)
  AS params
 INNER JOIN Shipper A ON A.ID = params.A_ID
 Left Join Order O ON A.ID = O.ID
 Left Join Customer C ON C A.ID = C.ID
 Left Join Quantity Q ON Q.ID = C.ID

或者,不要每个月重新计算一次。每月写一个新查询,然后将结果插入另一个表中?

,

如果您只想查询,更好的方法是使用case when语句,但是您不时需要不断更新查询以添加新的案例。

另一种优化的解决方案将是创建一个新表来存储 {strong> Shipper (表格)中的 Manual ID,Date,(Common) ID。然后创建一个视图,将上述所有表与新表连接起来。

新表格

Manual ID | Date       |   ID    |
343       | 24/07/2020 |   1     |
323       | 24/08/2020 |   2     |
323       | 24/08/2020 |   3     |
323       | 24/08/2020 |   4     |

然后创建一个视图,连接所有表,包括具有 ID 的新表。

在这种情况下,您只需要向新表中添加新值,即可自行查看结果。

CREATE VIEW MY_VIEW
AS
SELECT * FROM
(
 Select 
 T.[Manual ID],T.[Date],Q.Quantity
 From Shipper A
 Left Join Order O  A.ID = O.ID
 Left Join Customer C A.ID = C.ID
 Left Join Quantity Q Q.ID = C.ID
 Left Join NewTable T T.ID = A.ID
 )

现在,只需在新表中插入值,然后从MY_VIEW中获取完整数据即可。它将获得与您所要的结果相同的结果。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...