SQL-联合优先查询始终位于第一行

时间:2018-08-10 01:49:20

标签: sql sql-server tsql reporting-services

我是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 查询。我的第一个查询是一个非常大的查询。但是我想通过一个简单的查询来了解这一点

5 个答案:

答案 0 :(得分:2)

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

SELECT ...
       FROM (SELECT ...
                    0 o
                    FROM ...
                    ...
             UNION ALL
             SELECT DISTINCT
                    ...
                    1 o
                    FROM ...
                    ...) x
       ORDER BY x.o;
在我的建议中,

UNION可以替换为UNION ALL,因为第二个查询已经产生了不同的结果,并且第一个查询的结果也没有第二个查询的重复项,因为o总是不同的。不过有一个陷阱。在您的原始查询中,如果第二个查询的结果中有一行,也位于第一个查询的结果中,则该行将被重复数据删除,因此在最终结果中,将出现一行。正如我已经提到的那样,这里的订购栏将不再一样,因此这里不再发生。如果这是一个问题,则需要解决此问题,例如通过在第二个查询中使用WHERE NOT EXITS (...),不包括在第一个查询中找到的行。

顺便说一句:您的查询缺少各列之间的逗号。不要使用单引号来分隔标识符。使用双引号或方括号,这是SQL Server特有的。同样,如果您的第一个查询中的DISTINCT总是只返回一行,则没有意义。

答案 1 :(得分:1)

您只需在结果集中按该列的序号添加一个排序列和顺序即可。对您的查询执行此操作(在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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您需要使用显式的UDF

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,并且每个集合中的列应具有不同的值。
  • 不要对列名使用单引号。仅对字符串和日期常量使用单引号。

答案 4 :(得分:0)

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

联盟已经返回了不同的值,因此无需编写不同的关键字