2013-01-20 201 views
0

我在查詢中篩選重複值時遇到問題。這是我的查詢篩選子查詢結果

SELECT cid.IDS_NO,cid.SUB_TITLE,cid.E_SUB_NAME, (cid.SUB_TITLE || ' '|| cid.E_SUB_NAME), 
(SELECT(INST_BLK_HSE || ' ' || (SELECT E_STREET_NAME FROM street_table where street_code = d.INST_ST_CODE)) 
FROM del d where d.IDS_NO = cid.IDS_NO and ROWNUM = 1), 
(SELECT INST_ST_LEVEL || '-' || INST_STUNIT FROM detail d where d.IDS_NO = cid.IDS_NO and rownum = 1), 
('COUNTRY' ||' ' || pl_post),pl_post 
FROM SUBSCRIBER cid where pl_postal_district = 15 and rownum < 3001 
and hi_property_type IN ('CONDO','COMMERCIAL BUILDING'); 

這些是我有問題的部件:

(SELECT(INST_BLK_HSE || ' ' || (SELECT E_STREET_NAME FROM street_table where street_code = d.INST_ST_CODE)) 
FROM del d where d.IDS_NO = cid.IDS_NO and ROWNUM = 1), 
(SELECT INST_ST_LEVEL || '-' || INST_STUNIT FROM detail d where d.IDS_NO = cid.IDS_NO and rownum = 1); 

這些部件總能得到多條記錄,我想只得到1記錄最低的序列號,因此,這裏是我所做的:

(SELECT(INST_BLK_HSE || ' ' || (SELECT E_STREET_NAME FROM street_table where street_code = d.INST_ST_CODE)) 
FROM del d where d.IDS_NO = cid.IDS_NO and ROWNUM = 1 ORDER BY d.SEQ_NO DESC), 
(SELECT INST_ST_LEVEL || '-' || INST_STUNIT FROM detail d where d.IDS_NO = cid.IDS_NO and rownum = 1 ORDER BY d.SEQ_NO DESC); 

但我總是得到一個錯誤說缺少括號,但是當我通過刪除訂單,它工作正常。我應該怎麼做才能讓我的查詢正確運行?

+1

也許這個職位可以幫助http://stackoverflow.com/questions/5119190/oracle-sql-order-by-in-subquery-problems –

回答

3

格式化您的查詢,使其更易於閱讀很長的路要走開始。

但你也有一個相當棘手的問題,因爲你..

想只有1最低序列號記錄。

應該像這樣:

SELECT s.ids_no 
     ,s.sub_title 
     ,s.e_sub_name 
     ,(s.sub_title || ' '|| s.e_sub_name) AS title_sub_name 
     ,d.some_col_name 
     ,t.inst_name 
     ,('COUNTRY' ||' ' || s.pl_post) AS country_post 
     ,s.pl_post 
FROM subscriber s 

LEFT JOIN (
    SELECT d.ids_no 
     ,(d.inst_blk_hse || ' ' || st.e_street_name) AS some_col_name 
     ,ROW_NUMBER() OVER (PARTITION BY d.ids_no ORDER BY d.seq_no) AS rn 
    FROM del d 
    LEFT JOIN e_street_name st ON st.street_code = d.inst_st_code 
    ) d ON d.ids_no = s.ids_no AND d.rn = 1 

LEFT JOIN (
    SELECT ids_no 
     ,(inst_st_level || '-' || inst_stunit) AS inst_name 
     ,ROW_NUMBER() OVER (PARTITION BY d.ids_no ORDER BY d.seq_no) AS rn 
    FROM detail   
    ) t ON t.ids_no = s.ids_no AND t.rn = 1 


WHERE s.pl_postal_district = 15 
AND s.rownum < 3001 
AND s.hi_property_type IN ('CONDO','COMMERCIAL BUILDING'); 

更多細節上的子查詢下此相關的問題是如何工作的:
Select first row in each GROUP BY group?

的核心功能是ROW_NUMBER()拿到最低的順序記錄數。
我重寫了您的相關子查詢,因爲它們通常會吸收性能。他們也很難閱讀。
我使用LEFT JOIN,所以如果子查詢找不到任何匹配的東西,你仍然會得到一行。

+0

我試過查詢,但它仍然有錯誤。但是你確實給了我一個關於使用分區的想法。謝謝,順便說一句,對於我的查詢感到抱歉,如果它非常混亂,因爲我在SQL中還是很新的。再次感謝。 – marchemike

+0

@marchemike:很酷。 :)修正了一些表別名。 –

1

子查詢只能返回一行。因此,您必須將rownum = 1添加到子查詢FROM del d中的子查詢中。喜歡的東西:

SELECT 
    cid.IDS_NO, 
    cid.SUB_TITLE, 
    cid.E_SUB_NAME, 
    (cid.SUB_TITLE || ' '|| cid.E_SUB_NAME), 
    (SELECT (INST_BLK_HSE || ' ' || (SELECT E_STREET_NAME 
            FROM street_table 
            where street_code = d.INST_ST_CODE 
            and rownum = 1)) <<<<<<< here 
    FROM del d 
    where d.IDS_NO = cid.IDS_NO 
    and ROWNUM = 1), 
    (SELECT INST_ST_LEVEL || '-' || INST_STUNIT 
    FROM detail d 
    where d.IDS_NO = cid.IDS_NO 
    and rownum = 1), 
    ('COUNTRY' ||' ' || pl_post), 
    pl_post 
FROM SUBSCRIBER cid 
where pl_postal_district = 15 
    and rownum < 3001 
    and hi_property_type IN ('CONDO','COMMERCIAL BUILDING'); 

或者,JOIN都喜歡這樣的表:

SELECT 
    cid.IDS_NO, 
    cid.SUB_TITLE, 
    cid.E_SUB_NAME, 
    cid.SUB_TITLE || ' '|| cid.E_SUB_NAME, 
    d.INST_BLK_HSE || ' ' || s.E_STREET_NAME, 
    d.INST_ST_LEVEL || '-' || d.INST_STUNIT 
    'COUNTRY' ||' ' || pl_post), 
    pl_post 
FROM SUBSCRIBER cid 
INNER JOIN del   d ON d.IDS_NO  = cid.IDS_NO 
INNER JOIN detail  d2 ON d2.IDS_NO  = cid.IDS_NO 
INNER JOIN street_table s ON s.street_code = d.INST_ST_CODE 
WHERE cid.pl_postal_district = 15 
    and cid.rownum < 3001 
    and cid.hi_property_type IN ('CONDO','COMMERCIAL BUILDING') 
    and s.rownum = 1 
    and d.rownum = 1 
    and d2.rownum = 1;