SQL 服务器 - 在不使用 UNION 子句的情况下从单独的表中检索数据

SQL Server - Retrieve data from separate tables without using UNION clause

我有一个问题,不确定是否有可能的解决方案,但仍然想在这个论坛上提出这个问题,因为这里有一些大师可能会提供一些解决方案:)

我有两个表 - EMAIL_Request 和 SMS_Request。下面提供了示例数据模型。

Email_Request

Seq Cust_ID  Email_ID           Sent
1    123     test@gmail.com       Yes
2    234     abc@gmail.com        No

SMS_Request

Seq Cust_ID  MobileNo           Sent
1    345     1234567890          Yes
2    456     2345678900          Error

举报

我必须在一个带有模式的报告中显示两个表的输出。预期报告样本。

Mode    Cust_Id        Sent_To            Sent
EMAIL     123        test@gmail.com        Yes
EMAIL     234        abc@gmail.com         No
SMS       345        1234567890            Yes
SMS       456        2345678900            Error

问题:

我们使用 Java-Spring/Hibernate 内部构建了报告屏幕,用户可以在其中查看报告。我们只需在数据库中添加查询,框架将处理其余部分。

用户可以在报告中动态添加条件,也可以按模式或已发送(状态)进行搜索。屏幕上有一个搜索工具,可以只检索电子邮件记录或 SMS 记录。也是用户可以按已发送(状态)搜索的另一个标准。

目前,内部构建的框架只是根据用户输入将 where 条件附加到整个查询。因此,我不能使用 UNION 子句来检索报告。

那么,编写 SQL 查询的最佳选择是什么,我可以在其中按预期检索数据,可能使用 JOIN 子句,但这里我没有可以在两个之间加入的任何字段表,并且已经突出显示我不能使用 UNION 子句。

PS: 两个表的Seq只是它们的主键,所以不能用来连接。

I think below query should solve your problem.

select * from 
(
  select 'EMAIL' as Mode, cust_id, email_id as sent_to, Sent
  from EMAIL_Request

  union all

  select 'SMS' as Mode, cust_id, Mob_no as sent_to, Sent
  from SMS_Request
) as temp
where temp..... = ...

http://www.sqlfiddle.com/#!3/143d9/2

如果您认为不能使用 UNION 的原因是您必须编写仅包含一个 WHERE 子句的查询,那么请使用 CTE:

WITH CTE AS (
Query1
UNION ALL
Query2
)
SELECT * FROM CTE
WHERE...