【问题标题】:SQL - Union first query will always be first rowSQL - 联合第一个查询将始终是第一行
【发布时间】:2019-01-17 13:22:00
【问题描述】:

我是 SQL 新手。我正在为我的项目使用 SSRS(报告服务)。

第一个联合查询总是有 1 行。第二个联合查询将有 1 行或更多行。

而且我想始终在第一行进行第一个联合查询。

这是我的 SAMPLE 联合查询:

 SELECT DISTINCT
   R.TransactionPeriod as 'Transaction_Period'
   PQ.MedicalPaid as 'Medical_Paid'
   PQ.InsurancePaid as 'Insurance_Paid'
 FROM dbo.Medicals PQ
 JOIN dbo.Transaction R ON R.Pid = PQ.Pid

 UNION

 SELECT DISTINCT
   R.TransactionPeriod as 'Transaction_Period'
   TQ.MedicalPaid as 'Medical_Paid'
   TQ.InsurancePaid as 'Insurance_Paid'
 FROM dbo.Bills TQ
 JOIN dbo.Transaction R ON R.Pid = TQ.Pid

注意:这只是一个SAMPLE查询。我的第一个查询是一个非常大的查询。但我想通过一个简单的查询来理解这一点

【问题讨论】:

  • 我肯定会尝试以一种消除“不同”的方式运行它。这通常会更慢并且提供许多人忘记的结果。 Distinct 通常是获取唯一数据的“懒惰方式”的标志,而不是真正具体定义什么是唯一的。
  • 一个示例而不是 DISTINCT 将是 SELECT DISTINCT R.TransactionPeriod as 'Transaction_Period' PQ.MedicalPaid as 'Medical_Paid' PQ.InsurancePaid as 'Insurance_Paid' FROM dbo.Medicals PQ JOIN dbo.Transaction R ON R .Pid = R.TransactionPeriod、PQ.MedicalPaid、PQ.InsurancePaid 的 PQ.Pid 组

标签: sql sql-server tsql reporting-services


【解决方案1】:

如果我理解正确,您希望第一个查询的行在第二个查询的行之前排序。如果是这种情况,只需添加在第一个查询中设置为 1 和第二个查询中设置为 2 的列 row_order 然后按它排序。您不必在报告中显示该列。

【讨论】:

    【解决方案2】:

    您需要使用明确的order by

    SELECT Transaction_Period, Medical_Paid, Insurance_Paid
    FROM ((SELECT DISTINCT R.TransactionPeriod as Transaction_Period,
                  PQ.MedicalPaid as Medical_Paid
                  PQ.InsurancePaid as Insurance_Paid,
                  0 as ord
           FROM dbo.Medicals PQ JOIN
                dbo.Transaction R
                ON R.Pid = PQ.Pid
          ) UNION ALL
          (SELECT DISTINCT R.TransactionPeriod as Transaction_Period
                  TQ.MedicalPaid as Medical_Paid
                  TQ.InsurancePaid as Insurance_Paid,
                  1 as ord
           FROM dbo.Bills TQ JOIN
                dbo.Transaction R
                ON R.Pid = TQ.Pid
          )
         ) x
    ORDER BY ord;
    

    注意事项:

    • UNION ALL 是不必要的。每个子查询都有SELECT DISTINCT,每个集合中的列应该有不同的值。
    • 不要在列名中使用单引号。仅对字符串和日期常量使用单引号。

    【讨论】:

    • 你不需要所有的括号,因为 order by 无论如何都在联合上运行。您可以简单地从报告中排除 ord 列。
    • 对不起,我没有投反对票!但是你可以去掉你的外部选择和所有的括号,然后在最后留下一个 order by 的 2 个联合查询。这确实将 ord 列留在了结果集中,但由于它进入 ssrs,只需将列排除在外即可轻松处理。
    • @TomC 。 . .那只是一个巧合。我很抱歉假设你投了反对票。您对在应用层被忽略的列提出了一个很好的观点。
    【解决方案3】:

    在两个联合查询中选择一个文字,以便第一个查询小于第二个查询。使用ORDER BY 进行排序。

    SELECT ...
           FROM (SELECT ...
                        0 o
                        FROM ...
                        ...
                 UNION ALL
                 SELECT DISTINCT
                        ...
                        1 o
                        FROM ...
                        ...) x
           ORDER BY x.o;
    

    UNION 在我的建议中可以替换为UNION ALL,因为第二个查询已经产生了不同的结果,并且第一个查询的结果在第二个查询的结果中也没有重复,因为@987654325 @总是不同的。不过有一个问题。在您的原始查询中,如果第二个查询的结果中有一行,这也是第一个查询的结果,它将被删除重复数据,以便在最终结果中存在一个行。这将不会再发生在这里,因为我已经提到过 order 列是不同的。如果这是一个问题,您需要解决这个问题,例如通过在第二个查询中使用WHERE NOT EXITS (...),排除在第一个查询中找到的行。

    顺便说一句:您的查询缺少列之间的逗号。不要使用单引号来分隔标识符。使用 SQL Server 特有的双引号或方括号。此外,如果您的第一个查询中的 DISTINCT 始终只返回一行,那么它也没有任何意义。

    【讨论】:

      【解决方案4】:

      您可以简单地添加一个排序列并按结果集中列的序数值进行排序。对您的查询执行此操作(在排序列的 SELECT 语句下添加行,并在排序的末尾添加行):

      SELECT DISTINCT
        1 as SortOrder,
        R.TransactionPeriod as 'Transaction_Period'
        PQ.MedicalPaid as 'Medical_Paid'
        PQ.InsurancePaid as 'Insurance_Paid'
      FROM dbo.Medicals PQ
      JOIN dbo.Transaction R ON R.Pid = PQ.Pid
      
      UNION
      
      SELECT DISTINCT
        2 as SortOrder,
        R.TransactionPeriod as 'Transaction_Period'
        TQ.MedicalPaid as 'Medical_Paid'
        TQ.InsurancePaid as 'Insurance_Paid'
      FROM dbo.Bills TQ
      JOIN dbo.Transaction R ON R.Pid = TQ.Pid
      
      ORDER BY 1
      

      【讨论】:

        【解决方案5】:
        SELECT 
          1 as SortOrder,
          R.TransactionPeriod as 'Transaction_Period'
          PQ.MedicalPaid as 'Medical_Paid'
          PQ.InsurancePaid as 'Insurance_Paid'
        FROM dbo.Medicals PQ
        JOIN dbo.Transaction R ON R.Pid = PQ.Pid
        UNION
        SELECT 
          2 as SortOrder,
          R.TransactionPeriod as 'Transaction_Period'
          TQ.MedicalPaid as 'Medical_Paid'
          TQ.InsurancePaid as 'Insurance_Paid'
        FROM dbo.Bills TQ
        JOIN dbo.Transaction R ON R.Pid = TQ.Pid
        ORDER BY SortOrder
        

        联合已经返回不同的值,所以不需要写不同的关键字

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-09
          • 1970-01-01
          • 2020-01-07
          • 2014-12-02
          • 1970-01-01
          • 1970-01-01
          • 2015-10-24
          • 1970-01-01
          相关资源
          最近更新 更多