2013-04-26 31 views
0

下面給出的是一個正在運行的查詢。我想用直接聯合查詢替換所有子查詢。請建議我一個解決方案。如何用聯合查詢替換子查詢?

SELECT 
    id, 
    startTime, 
    endTime, 
    drawingTime, 
    result, 
    wpAmount, 
    lpAmount, 
    prize, 
    cntWinTickets, 
    cntLoosTickets 
FROM (SELECT 
    i.id   AS id, 
    i.start_time AS startTime, 
    i.end_time  AS endTime, 
    i.drawing_time AS drawingTime, 
    i.result  AS result, 
    SUM(t.amount) AS wpAmount, 
    SUM(t.prize) AS prize, 
    COUNT(t.id) AS cntWinTickets 
     FROM issues i 
    LEFT JOIN orders o 
     ON o.issue_id = i.id 
    LEFT JOIN tickets t 
     ON t.order_id = o.id 
     AND t.has_prize = 1 
     GROUP BY i.id) AS A 
    INNER JOIN (SELECT 
     i.id   AS lid, 
     SUM(t.amount) AS lpAmount, 
     COUNT(t.id) AS cntLoosTickets 
      FROM issues i 
     LEFT JOIN orders o 
      ON o.issue_id = i.id 
     LEFT JOIN tickets t 
      ON (t.order_id = o.id 
       AND (t.has_prize = 0 
       OR t.has_prize IS NULL)) 
      GROUP BY i.id) AS B 
    ON A.id = B.lid 
+0

如果您創建** VIEW ** – 2013-04-26 09:23:32

+0

,您可以發佈架構和所需的輸出,這可能是最好的選擇。以及一些示例數據,它會更好地解決 – 2013-04-26 09:25:24

回答

2

這是一個解決方案,在SUM運算符中有一個奇特的交叉乘積。我認爲最好不要這樣做,但它很有趣!

SELECT i.id AS id, 
     i.start_time AS startTime, 
     i.end_time AS endTime, 
     i.drawing_time AS drawingTime, 
     i.result AS result, 
     SUM(t.amount*COALESCE(t.has_prize,0)) AS wpAmount, 
     SUM(t.prize*COALESCE(t.has_prize,0)) AS prize, 
     COUNT(case when t.has_prize=1 then t.id end) AS cntWinTickets, 
     SUM(t.amount*(1-COALESCE(t.has_prize,0))) AS lpAmount, 
     COUNT(case when COALESCE(t.has_prize,0)=0 then t.id end) AS cntLoosTickets 
FROM issues i 
LEFT JOIN orders o ON o.issue_id = i.id 
LEFT JOIN tickets t ON t.order_id = o.id AND t.has_prize in (null,0,1) 
GROUP BY i.id 
+0

這是什麼?爲什麼這裏有多個't.amount * COALESCE(t.has_prize,0)' – 2013-04-26 09:37:38

+0

't.has_prize'要麼是'1','0'或'NULL'。如果你想在't.has_prize'等於'1'時求和,你可以做一個交叉產品。相反,'t.amount *(1-COALESCE(t.has_prize,0))'適用於''。 – 2013-04-26 09:39:53

1

嘗試:

SELECT i.id AS id, 
     i.start_time AS startTime, 
     i.end_time AS endTime, 
     i.drawing_time AS drawingTime, 
     i.result, 
     SUM(case when t.has_prize=1 then t.amount end) AS wpAmount, 
     SUM(case when t.has_prize=1 then t.prize end) AS prize, 
     COUNT(case when t.has_prize=1 then t.id end) AS cntWinTickets, 
     SUM(case when coalesce(t.has_prize,0)=0 then t.amount end) AS lpAmount, 
     COUNT(case when coalesce(t.has_prize,0)=0 then t.id end) AS cntLoosTickets 
FROM issues i 
LEFT JOIN orders o ON o.issue_id = i.id 
LEFT JOIN tickets t ON t.order_id = o.id AND t.has_prize in (null,0,1) 
GROUP BY i.id 
1

這裏是如何結合這

SELECT 
    i.id   AS id, 
    i.start_time AS startTime, 
    i.end_time  AS endTime, 
    i.drawing_time AS drawingTime, 
    i.result  AS result, 
    SUM(IF t.has_prize = 1,t.amount,0) AS wpAmount, 
    SUM(IF t.has_prize = 1,t.prize,0) AS prize, 
    COUNT(IF t.has_prize = 1,t.id,0) AS cntWinTickets, 
    SUM(IF t.has_prize = 0,t.amount,0) AS lpAmount, 
    COUNT(IF t.has_prize = 0,1,0) AS cntLoosTickets 
FROM issues i 
    LEFT JOIN orders o ON o.issue_id = i.id 
    LEFT JOIN tickets t ON t.order_id = o.id 
GROUP BY i.id 

IF t.has_prize = 1,t.amount,0這意味着如果t.has_prize = 1不是採取t.amount別人拿0。備用是馬克使用的CASE。