Может кто-нибудь определить ошибку с предложением WITH ()? - PullRequest
0 голосов
/ 24 октября 2018

SQL не распознает переменную, которую я вызываю в основном операторе SELECT.Переменная, которую я вызываю, является execs.block_order_quantity.Я называю эту переменную в операторе WITH в начале запроса.Код приведен ниже, а ошибка прикреплена в виде рисунка.Я запустил оператор select без элемента WITH execs as(, и он работает просто отлично.

WITH execs as(SELECT th.exec_id, SUM(eha.tck_ord_qty) as "BLOCK_ORDER_QUANTITY"  
FROM t1 eha
join t2 th
on eha.exec_id = th.exec_id
where th.trdng_desk_sname IN ('NAME')
and th.trd_dt between to_date('201840101', 'YYYYMMDD')
and to_date ('20140301', 'YYYYMMDD')
and exists
    (SELECT 1
     FROM t2t eth
     WHERE eth.TRD_ID = eha.TRD_ID
     AND eth.trd_stat_cd = 'EX')
group by th.exec_id)
SELECT DISTINCT
th.trd_dt as "TRADE_DATE",
eah.ord_cap_qty as "CAP_AMOUNT",
execs.block_order_quantity as "BLOCK_ORDER_QUANTITY", 
eah.alloc_ovrrd_rsn_cd as "ALLOC_OVRRD_RSN_CD",
  CASE   --create allocation case id 
        WHEN(eh.manl_alloc_ind = 'Y'
            OR NVL (eah.trdr_drct_qty, 0) > 0
            OR NVL (eah.trdr_drct_wgt_ratio, 0) > 0)
        THEN
            'Y'
        ELSE
            'N'
      END 
        AS "ALLOCATION_OVRRD_IND",
      CASE
        WHEN (eh.manl_alloc_ind = 'Y'
             OR NVL (eah.trdr_drct_qty, 0) > 0
             OR NVL (eah.trdr_drct_wgt_ratio, 0) > 0)
        THEN
          TH.EXEC_TMSTMP
        ELSE
          NULL
       END
         AS "ALLOCATION_OVRRD_TIMESTAMP",
eah.alloc_adj_assets_rt_curr_amt as "FUND_ADJ_NET_ASSETS",
eah.as_alloc_exec_hld_qty as "FUND_HOLDINGS_QUANTITY",
th.as_trd_iv_lname as "SECURITY_NAME",
th.as_trd_fmr_ticker_symb_cd as "TICKER",
   CASE  
      WHEN NVL(th.limit_prc_amt, 0) > 0 THEN 'LIMIT' ELSE NULL END
          AS "FUND_ORDER_TYPE"
from t1 eah
join t3 eh
on eah.exec_id = eah.exec_id
join t2 th
on th.trd_id = eah.trd_id
join t4 tk
on tk.tck_id = eah.tck_id
join t5 pm
on eah.pm_person_id_src = pm.person_id_src
where th.trdng_desk_sname IN('NAME')
and th.trd_dt between to_date('20140101', 'YYYYMMDD')
and to_date ('20140301', 'YYYYMMDD')
and rownum < 15

enter image description here

1 Ответ

0 голосов
/ 24 октября 2018

Вам необходимо присоединиться к имени execs общего табличного выражения (CTE) в вашем основном запросе, например:

...
from t1 eah
join t3 eh
on eah.exec_id = eah.exec_id
join t2 th
on th.trd_id = eah.trd_id
join execs
on execs.exec_id = eh.exec_id
join t4 tk
...

Я не уверен, что вы на самом деле хотите CTE здесь, похожевы можете просто выполнить агрегирование в основном запросе, когда вы ссылаетесь на те же таблицы;но может быть что-то мне не хватает, например, дубликаты, введенные последующими объединениями.

Кстати, первое предложение on выглядит там неправильно, поскольку обе стороны ссылаются на один и тот же столбец в одной и той же таблице;так что, вероятно, это должно быть:

...
from t1 eah
join t3 eh
on eh.exec_id = eah.exec_id
join t2 th

Наличие distinct иногда является признаком того, что объединения неправильны и есть дубликаты, которые вы хотите исключить, которых на самом деле не должно быть, так что вы можете этого не делатьнеобходимо, чтобы после того, как условие соединения было установлено;и это может позволить простой агрегат также работать, если раньше он давал неправильный результат.(Или может быть еще какая-то другая причина, по которой это не подходит.)

Кроме того, where rownum < 15 даст неопределенный набор строк, поскольку вы не упорядочиваете набор результатов перед применением этого фильтра.

...