我正在處理對我來說一個複雜的查詢,並且我已經設法獲取我需要的信息,但似乎被迫創建一個表來完成它。我正在使用MySQL,所以我不能使用WITH
,我不能使用視圖,因爲我的SELECT
在FROM
子句中包含子查詢,並且我不能使用臨時表,因爲我需要自聯接。我錯過了什麼嗎?SQL查詢:子查詢上的自加入需要創建一個單獨的(非臨時)表?
背景:
- 一個
reservation
可以具有1個或多個reservation_detail
(上reservation_id
外鍵rel'p) - 一個
reservation_detail
具有quantity
和ticket_type
(上ticket_type
外鍵rel'p)
這是我目前解決方案的第一部分:
CREATE TABLE
tmp
SELECT
t.reservation_id,
t.ticket_type,
COALESCE(rd.quantity,0) AS qty
FROM (
SELECT *
FROM
(ticket_type tt, reservation r)
) t
LEFT JOIN
reservation_detail rd
ON
t.reservation_id = rd.reservation_id
AND
t.ticket_type = rd.ticket_type;
這給了我一個表,如下所示,其中用於reservation_id
和ticket_type
的每一個組合,我有一個qty
。
+----------------+-------------+------+
| reservation_id | ticket_type | qty |
+----------------+-------------+------+
| 1 | ADULT | 2 |
| 1 | CHILD | 2 |
| 1 | INFANT | 0 |
| 2 | ADULT | 1 |
| 2 | CHILD | 0 |
| 2 | INFANT | 0 |
| 3 | ADULT | 1 |
| 3 | CHILD | 0 |
| 3 | INFANT | 0 |
+----------------+-------------+------+
現在我可以自己加入三次在此表中得到什麼,我真的找...
SELECT
t1.reservation_id,
t1.qty AS num_adults,
t2.qty AS num_children,
t3.qty AS num_infants
FROM
tmp t1
LEFT JOIN
tmp t2
ON
t1.reservation_id = t2.reservation_id
LEFT JOIN
tmp t3
ON
t2.reservation_id = t3.reservation_id
WHERE
t1.ticket_type = 'ADULT'
AND
t2.ticket_type = 'CHILD'
AND
t3.ticket_type = 'INFANT';
...這是用於顯示每個數量各保留一個排三種票類型。
+----------------+------------+--------------+-------------+
| reservation_id | num_adults | num_children | num_infants |
+----------------+------------+--------------+-------------+
| 1 | 2 | 2 | 0 |
| 2 | 1 | 0 | 0 |
| 3 | 1 | 0 | 0 |
+----------------+------------+--------------+-------------+
我希望這是足夠的信息。如果不是,請留下評論。然而
SELECT reservation_id,
SUM(CASE WHEN ticket_type='ADULT' THEN qty ELSE 0 END) AS adults,
SUM(CASE WHEN ticket_type='CHILD' THEN qty ELSE 0 END) AS children,
SUM(CASE WHEN ticket_type='INFANT' THEN qty ELSE 0 END) AS infants,
FROM tmp
GROUP BY reservation_id;
,我想知道一下自己的模式:
感謝大家迅速答覆。我每天都在學習更多關於優秀SQL查詢的力量:) – nselikoff 2009-09-29 16:53:09