2016-02-01 15 views
0

我有一個問題,並不確定是否有一個可能的解決方案,但仍然認爲在此論壇中提出它,因爲這裏有一些主人可能能夠提供一些解決方案:)SQL Server - 不使用UNION子句從單獨的表中檢索數據

我有兩個表 - EMAIL_Request和SMS_Request。下面提供了示例數據模型。

Email_Request

Seq Cust_ID Email_ID   Sent 
1 123  [email protected]  Yes 
2 234  [email protected]  No 

SMS_Request

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

報告

我必須證明這兩個表的輸出與模式單一報告。樣本預期報告。

Mode Cust_Id  Sent_To   Sent 
EMAIL  123  [email protected]  Yes 
EMAIL  234  [email protected]   No 
SMS  345  1234567890   Yes 
SMS  456  2345678900   Error 

問題:

我們已經在內部使用內置Java的春/ Hibernate的報告屏幕,用戶可以看到該報告。我們只需要在數據庫中添加Query,框架將處理其餘的部分。

用戶可以在報表中動態添加條件,也可以按模式或發送(狀態)進行搜索。屏幕上有一個搜索工具來檢索電子郵件記錄或SMS記錄。用戶可以通過發送(狀態)進行搜索的另一個標準。

目前,內部構建的框架只是簡單地將where條件附加到整個查詢中,具體取決於用戶輸入。因此,我不能使用UNION子句檢索報告。

那麼,寫一個SQL查詢的最佳選擇是什麼,我可以根據預期檢索數據,可能使用JOIN子句,但是在這裏我沒有任何字段可以在兩個表之間加入,並且已經突出顯示我不能使用UNION子句。

PS:Seq這兩個表只是它們的主鍵,所以不能用於連接。

+0

看起來像你可以在子查詢中使用'UNION',並讓你的框架附加一個'where'子句。懷疑它是最有效的解決方案,儘管子查詢或CTE是 – HoneyBadger

+0

,它是我能想到的最有效的解決方案。 –

+0

Hi @TabAlleman ..我不能使用UNION,因爲系統會將where子句附加到最後一個查詢。例如。示例聯合查詢將選擇'EMAIL'作爲Mode,cust_id,email_id作爲Sent_To,從Email_Request發送UNION選擇'SMS'作爲模式,cust_id,mobileNo作爲Sent_To,從SMS_Request發送........用戶將添加搜索條件,然後系統將附加where子句的東西像選擇'EMAIL'作爲模式,cust_id,email_id作爲Sent_To,從Email_Request發送UNION選擇'SMS'作爲模式,cust_id,mobileNo作爲Sent_To,從SMS_Request發送,其中Sent = '是'。所以沒有哪裏條款Email_Request – vnkotak

回答

3

如果你認爲你不能使用UNION的原因是因爲你必須寫一個查詢,只有一個WHERE子句,然後使用一個CTE:

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

謝謝@TabAlleman ..這工作。 – vnkotak

1
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

相關問題