2017-07-30 81 views
0

我的select語句有點問題。我需要選擇每種類型從我的桌子手機的最新記錄,所以我試試這個代碼:將幾行空值合併爲一個

CREATE TABLE contacts(
tel_number VARCHAR2(14), 
tel_type NUMBER, 
row_id_con NUMBER, 
record_id NUMBER 
); 

CREATE TABLE orders(
order_id VARCHAR2(9), 
row_id_ord NUMBER 
); 

INSERT INTO contacts VALUES('444-444-444', 1, 1, 1); 
INSERT INTO contacts VALUES('22-22-22', 2, 1, 2); 
INSERT INTO contacts VALUES('555-555-555', 1, 1, 3); 

INSERT INTO orders VALUES('111111111', 1); 

SELECT ord.order_id, 
     DECODE(con.tel_type, 1, con.tel_number) AS number1, 
     DECODE(con.tel_type, 2, con.tel_number) AS number2 
FROM (SELECT MAX(c.record_id) as max_row_id 
     FROM contacts c, orders o 
     WHERE c.row_id_con = o.row_id_ord 
     and o.order_id = '111111111' 
     GROUP BY c.tel_type) c, contacts con, orders ord 
WHERE con.row_id_con = ord.row_id_ord 
     and con.record_id = c.max_row_id 
GROUP BY ord.order_id, con.tel_type, con.tel_number; 

輸出現在是這樣的:

order_id number1  number2 
111111111 null   22-22-22 
111111111 555-555-555 null 

但我需要類似的東西:

order_id number1  number2 
111111111 555-555-555 22-22-22 

我該怎麼做?

回答

0

更多的解決方案:

SELECT o.order_id, 
     max(case c.tel_type when 1 then tel_number end) 
      KEEP (DENSE_RANK LAST ORDER BY row_id_con NULLS FIRST) as number1, 
     max(case c.tel_type when 2 then tel_number end) 
      KEEP (DENSE_RANK LAST ORDER BY row_id_con NULLS FIRST) as number2 
FROM orders o 
LEFT JOIN contacts c ON c.row_id_con = o.row_id_ord 
GROUP BY o.order_id 
; 
0

與ROWNUM < 2總結,並添加ORDER BY獲得最大RECORD_ID:

select * from (
SELECT ord.order_id, 
     DECODE(con.tel_type, 1, con.tel_number) AS number1, 
     DECODE(con.tel_type, 2, con.tel_number) AS number2 
FROM (SELECT MAX(c.record_id) as max_row_id 
     FROM contacts c, orders o 
     WHERE c.row_id_con = o.row_id_ord 
     and o.order_id = '111111111' 
     GROUP BY c.tel_type) c, contacts con, orders ord 
WHERE con.row_id_con = ord.row_id_ord 
     and con.record_id = c.max_row_id 
GROUP BY ord.order_id, con.tel_type, con.tel_number 
order by c.record_id desc 
) 
where rownum < 2; 

您可以通過條款修改爲了得到其他的順序c.record_id desc

0

你想用row_number()。事情是這樣的:

SELECT o.order_id, 
     MAX(CASE WHEN tel_type = 1 AND seqnum = 1 THEN tel_number END) as number1, 
     MAX(CASE WHEN tel_type = 2 AND seqnum = 1 THEN tel_number END) as number2 
FROM (SELECT o.order_id, c.*, 
       ROW_NUMBER() OVER (PARTITION BY o.order_id, c.tel_type 
           ORDER BY record_id DESC 
           ) as seqnum 
     FROM contacts c JOIN 
      orders o 
      ON c.row_id_con = o.row_id_ord AND 
       o.order_id = '111111111' 
    ) o 
GROUP BY order_id; 

注:FROM子句中

  • 決不使用逗號。 始終使用使用正確的,明確的JOIN語法。
  • CASE優於DECODE(),因爲它是ANSI標準的SQL,因此它是標準語言的一部分。
  • 您可以使用窗口函數大大簡化查詢並提高性能。
  • 您可以刪除子查詢中order_id的條件以獲取所有訂單的行。
  • 您希望GROUP BY僅包含定義所需結果集中每一行的列。