首页 > 解决方案 > 消息 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

标签: sqlsql-server

解决方案


对于UNIONUNION 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

推荐阅读