我是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 查询。我的第一个查询是一个非常大的查询。但是我想通过一个简单的查询来了解这一点
答案 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
联盟已经返回了不同的值,因此无需编写不同的关键字