2017-03-09 29 views
2

我已經做了一些相同的錯誤,我幾乎已經嘗試過所有建議的解決方案。Union SUM SQL必須有其自己的別名

這裏是SQL:

SELECT Sum(h.counter1 + l.counter2) AS hour_amount 
FROM ( 
      SELECT 1 
      FROM xp_hour h 
      WHERE h.account_id = '1' 
      AND h.hour_date = Date('2017-03-06') 
      AND (( 
           h.from_time < Time('06:00') 
         AND h.till_time > Time('06:00')) 
       OR  ( 
           h.from_time < Time('15:00') 
         AND h.till_time > Time('15:00')) 
       OR  ( 
           h.from_time = Time('06:00') 
         AND h.till_time = Time('15:00')))) 
UNION ALL 
     ( 
      SELECT 1 
      FROM xp_leave l 
      WHERE l.account_id = '1' 
      AND (( 
            l.from_datetime < Timestamp('2017-03-06 06:00') 
          AND l.till_datetime > Timestamp('2017-03-06 06:00')) 
        OR  ( 
            l.from_datetime < Timestamp('2017-03-06 15:00') 
          AND l.till_datetime > Timestamp('2017-03-06 15:00')))) t_union 

錯誤

Error: Every derived table must have its own alias 
+0

我想如果你只是格式化了你的查詢,你會爲自己節省幾個小時。 – Stephen

回答

3

試試這個:

SELECT SUM(h.counter1 + l.counter2) AS hour_amount 
FROM ( 
    SELECT 1 
    FROM xp_hour h 
    WHERE h.account_id = '1' AND h.hour_date = DATE('2017-03-06') AND 
     ( 
      (h.from_time < TIME('06:00') AND h.till_time > TIME('06:00')) OR 
      (h.from_time < TIME('15:00') AND h.till_time > TIME('15:00')) OR 
      (h.from_time = TIME('06:00') AND h.till_time = TIME('15:00')) 
     ) 

    UNION ALL 

    SELECT 1 
    FROM xp_leave l 
    WHERE l.account_id = '1' AND 
     (
     (l.from_datetime < TIMESTAMP('2017-03-06 06:00') AND 
      l.till_datetime > TIMESTAMP('2017-03-06 06:00')) OR 
     (l.from_datetime < TIMESTAMP('2017-03-06 15:00') AND 
     l.till_datetime > TIMESTAMP('2017-03-06 15:00')) 
     ) 
) t_union 

您需要封閉整個UNION ALL子查詢在括號中,而不是參與的單個子查詢操作。

+0

非常感謝! – DevNiels

-1

名稱派生表的UNION ALL前的第一部分別名,就像你把t_union的第二部分。

例如:

(SELECT 1 
FROM xp_hour h 
WHERE h.account_id = '1' 
AND h.hour_date = DATE('2017-03-06') 
AND ((h.from_time < TIME('06:00') 
AND h.till_time > TIME('06:00')) 
OR (h.from_time < TIME('15:00') 
AND h.till_time > TIME('15:00')) 
OR (h.from_time = TIME('06:00') 
AND h.till_time = TIME('15:00')))) as t_union_1 
1

問題是與括號。第一個查詢被解釋爲屬於第一個來自的單獨問題。

試試這個:

SELECT SUM(h.counter1 + l.counter2) AS hour_amount FROM 
(SELECT 1 FROM xp_hour h WHERE h.account_id = '1' AND h.hour_date = DATE('2017-03-06') AND ((h.from_time < TIME('06:00') AND h.till_time > TIME('06:00')) OR (h.from_time < TIME('15:00') AND h.till_time > TIME('15:00')) OR (h.from_time = TIME('06:00') AND h.till_time = TIME('15:00'))) 
UNION ALL 
(SELECT 1 FROM xp_leave l WHERE l.account_id = '1' AND ((l.from_datetime < TIMESTAMP('2017-03-06 06:00') AND l.till_datetime > TIMESTAMP('2017-03-06 06:00')) OR (l.from_datetime < TIMESTAMP('2017-03-06 15:00') AND l.till_datetime > TIMESTAMP('2017-03-06 15:00'))))) t_union 

我從第一次查詢中刪除最後)結束的union

相關問題