【问题标题】:I need a help - Making this bad query better我需要帮助 - 让这个糟糕的查询变得更好
【发布时间】:2018-06-15 08:35:45
【问题描述】:
Select
Max(isnull(UpdateDate, InsertDate)) as A
From yourTable
Where UpdateCode = 'ABC' or InsertCode = 'ABC'

Select
Max(isnull(UpdateDate, InsertDate)) as B
From yourTable
Where UpdateCode = 'ZYX' or InsertCode = 'ZYX'

我想将这两个查询合二为一。 所以我把它变成了这样

Select
Max(isnull(UpdateDate, InsertDate)) as A,
Max(isnull(UpdateDate, InsertDate)) as B
From yourTable
Where (UpdateCode = 'ZYX' or InsertCode = 'ZYX')
or (UpdateCode = 'ABC' or InsertCode = 'ABC')

这个查询带来了错误的数据。

【问题讨论】:

  • 样本数据和预期结果可能会在这里有所帮助。还有,“帮帮我?”这不是一个问题。请提出一个具体的问题。你需要什么帮助?谢谢。

标签: sql sql-server select max


【解决方案1】:

在您的查询中,AB 是完全相同的术语,因此它们将具有完全相同的值。 处理此问题的一种方法是在max 调用中的case 表达式中添加逻辑:

SELECT MAX(CASE WHEN 'ABC' IN (InsertCode, UpdateCode) 
                THEN ISNULL(UpdateDate, InsertDate)
           END) AS a
       MAX(CASE WHEN 'XYZ' IN (InsertCode, UpdateCode) 
                THEN ISNULL(UpdateDate, InsertDate)
           END) AS a
FROM  YourTable
-- Where clause is an optimization, functionality would be correct even without it
WHERE 'ABC' IN (InsertCode, UpdateCode) OR
      'XYZ' IN (InsertCode, UpdateCode)

【讨论】:

    【解决方案2】:

    我相信你想有条件地计算每个MAX

    Select
        Max(CASE WHEN UpdateCode = 'ZYX' or InsertCode = 'ZYX' THEN isnull(UpdateDate, InsertDate) END) as A,
        Max(CASE WHEN UpdateCode = 'ABC' or InsertCode = 'ABC' THEN isnull(UpdateDate, InsertDate) END) as B
    From 
        yourTable
    Where   
        UpdateCode IN ('ZYX', 'ABC') or InsertCode IN ('ZYX', 'ABC')
    

    【讨论】:

      【解决方案3】:

      一个非常简单的方法是将两个Statement与“Union select”结合起来。

      否则你必须清楚地描述你对结果的期望。

      【讨论】:

        【解决方案4】:

        查询本身似乎有点奇怪,但我相信您有 2 个选择;

        首先是使用“IN”语句让你的where条件能够满足多个条件

        WHERE UpdateCode IN (‘ABC’, 'ZYX') or InsertCode IN (‘ABC’, 'ZYX')
        

        其次是使用 JOIN 让两个字段匹配 - 我认为这更符合您的目标

        SELECT 
            ds1.A
            ds2.B
        FROM (
            Select
                1 AS ID,
                Max(isnull(UpdateDate, InsertDate)) as A        
            From yourTable
            Where UpdateCode = 'ABC' or InsertCode = 'ABC'
        ) ds1
        INNER JOIN (
            Select
                1 AS ID,
                Max(isnull(UpdateDate, InsertDate)) as B
            From yourTable
            Where UpdateCode = 'ZYX' or InsertCode = 'ZYX'
        ) ds2
        ON ds1.ID = ds2.ID
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多