2017-01-30 87 views
0

我試圖刪除以下查詢的工會全部。如何刪除union all?

DECLARE @TEMP TABLE (ID INT,DESCR VARCHAR(20)) 
      INSERT INTO @TEMP 
      SELECT 1,'A' 
      UNION 
      SELECT 2,'B' 
      UNION 
      SELECT 3,'C' 
      UNION 
      SELECT 4,'D' 

      SELECT DESCR,ID FROM @TEMP 
      WHERE DESCR NOT IN ('A','B') 
      UNION ALL 
      SELECT 'A+B',SUM(ID) FROM @TEMP 
      WHERE DESCR IN ('A','B') 

是否有一個建議,而不是使用UNION ALL

+5

爲什麼你要做到這一點,你實際上是希望能實現嗎?你不清楚你想要做什麼以及爲什麼。請添加您所需的輸出。 – Tanner

+0

順便說一下,添加ID是一個有趣的想法。 –

+0

Hi @ThorstenKettner id只是一個名字,如果你有任何id問題,你可以使用值而不是id。 –

回答

1

您可以使用group bycase

SELECT (CASE WHEN DESCR IN ('A', 'B') THEN 'AB' 
      ELSE DESCR 
     END) as DESCR, SUM(ID) as ID FROM @TEMP 
FROM @TEMP 
GROUP BY (CASE WHEN DESCR IN ('A', 'B') THEN 'AB' 
       ELSE DESCR 
      END); 

這確實讓兩個重要的假設:

  • DESCR是唯一的,至少對於不包含的行和'B'
  • 'AB'不在數據中。

如果這些都是真的,你仍然可以做你想要的,但查詢可能會更復雜一點(並且表可能需要一個唯一的ID)。

1

如果確保DESCR在表中不能爲空,那麼就沒有NOT IN問題,我們不需要任何額外的空處理來模仿它。

你會做的是建立僞組。 A「組」爲每一個非A/B記錄和全部A/B記錄的真實組:

select 
    max(case when descr in ('A','B') then 'A+B' else descr end) as descr, 
    sum(id) as id 
from @temp 
group by 
    case when descr in ('A','B') then 'A' else descr end, 
    case when descr in ('A','B') then 0 else id end; 

這個僞分組只能然而,當有表中沒有重複(例如,兩個記錄E/5)。如果有的話,那麼我們將不得不隨時生成一個唯一的密鑰。

編輯:爲了完整起見:如果表中可以有重複,我們需要一個唯一的標識符。一個簡單的解決方案是使用無證%%physloc%%。 (另一種方法是,我們與ROW_NUMBER創建行號從派生表中選擇。)

group by 
    case when descr in ('A','B') then 'A' else descr end, 
    case when descr in ('A','B') then 0 else id end, 
    case when descr in ('A','B') then 0 else %%physloc%% end; 
0
SELECT DESCR, CASE WHEN DESCR = 'A+B' THEN SUM(ID) ELSE MAX(ID) END AS ID 
FROM (
     SELECT CASE WHEN DESCR IN('A', 'B') THEN 'A+B' ELSE DESCR END AS DESCR, ID 
     FROM @TEMP 
) a 
GROUP BY DESCR; 

http://rextester.com/FUTXBQ64727