sql - 消息 205,级别 16,状态 1,使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询必须具有相等数量的表达式
问题描述
我想从不同的表中选择随机行order by newid()
并将结果合并在一起,但我收到错误我做错了什么?
create procedure [dbo].[genrate_Exame]
@course_id int
as
if @course_id = 600
begin
select top(7)
C.C#_Mcq_Id,
C.C#_MCQ_Question,
C.C#_Choices,
null as [no_question]
from C#_MCQ C
union all
select top(3)
T.C#_T_F_Id,
T.C#_T_F_Q,
null as [no_question]
from C#_T_F T
order by NEWID()
end
else if (@course_id = 500)
begin
select top(7)
Q.SQl_Mcq_id,
Q.SQl_MCQ_Question,
Q.SQl_Choices,
null as [no_question]
from SQl_MCQ Q
union all
select top(3)
QT.SQl_T_F_Id,
QT.SQl_T_F_Q,
null as [no_question]
from
SQl_T_F QT
order by
NEWID()
end
解决方案
对于UNION
和UNION ALL
,必须满足以下条件。在 MSDN 上阅读 UNION
以下是使用 UNION 组合两个查询的结果集的基本规则:
在所有查询中,列的数量和顺序必须相同。
数据类型必须兼容。
在您的情况下,您没有相同数量的表达式:
-- 4 columns here
select top(7)
C.C#_Mcq_Id,
C.C#_MCQ_Question,
C.C#_Choices,
null as [no_question]
from C#_MCQ C
union all
-- 3 columns here
select top(3)
T.C#_T_F_Id,
T.C#_T_F_Q,
null as [no_question]
from C#_T_F T
此外,如果您想随机获取值,您可以ORDER BY NEWID()
在 SELECT 查询的两个部分中应用,而不仅仅是在外部。
SELECT * FROM
(
select top(7)
C.C#_Mcq_Id,
C.C#_MCQ_Question,
C.C#_Choices,
null as [no_question]
from C#_MCQ C
ORDER BY NEWID()
) as t1
union all
SELECT * FROM
(
select top(3)
T.C#_T_F_Id,
T.C#_T_F_Q,
null as [C#_Choices]
null as [no_question]
from C#_T_F T
ORDER BY NEWID()
) as t2
推荐阅读
- css - 更改引导大小
- python - 网络在训练期间不会改变权重,pytorch
- macros - Julia中基准和时间宏之间的区别
- jquery - 将arraylist对象servlet传递给jquery ajax方法
- android - QVideoFrame::map() 崩溃
- ios - iOS - 使用 AFNetworking 库将数组错误作为参数传递
- python - python:将时间从“2009-11-10T23:00:00Z”更改为 int
- javascript - onClick 不适用于选项字段
- javascript - 用数字对数组进行排序
- python - 如何将我的 python 脚本的输出保存为 CSV 文件?