2013-12-09 51 views
2

我做下面的查詢,錯誤where子句PL/SQL查詢選擇從雙

SELECT 'Payment Token,Transaction ID,Create Date' 
    FROM dual 
UNION ALL 
SELECT DISTINCT 
     pt.mw_payment_token ||','|| 
     t.mw_transaction_id ||','|| 
     t.create_date 
    FROM t_mw_payment_token pt, 
     t_mw_transaction t 
where pt.mw_payment_token = t.mw_payment_token 
order by t.mw_transaction_id; 

錯誤是:

ORA-00904: "T"."MW_TRANSACTION_ID": invalid identifier 
00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 
Error at Line: 5 Column: 103 

爲什麼列mw_transaction_id無效?

編輯:

t_mw_transaction表

ENABLECREATE TABLE WFMW.T_MW_TRANSACTION 
(
    MW_PAYMENT_TOKEN VARCHAR2(40 BYTE) NOT NULL, 
    CREATE_DATE DATE DEFAULT NULL, 
    MW_TRANSACTION_ID NUMBER NOT NULL, 
    TRANSACTION_TYPE NUMBER(*, 0), 
    CONSTRAINT XPK_T_MW_TRANSACTION PRIMARY KEY 
    (
    MW_TRANSACTION_ID 
) 
    ENABLE 
) 

mw_payment_token表

ENABLECREATE TABLE WFMW.T_MW_PAYMENT_TOKEN 
(
    MW_PAYMENT_TOKEN VARCHAR2(40 BYTE) NOT NULL 
, CREATED_BY VARCHAR2(50 BYTE) 
, MODIFIED_BY VARCHAR2(50 BYTE) 
, CREATE_DATE DATE 
, MODIFIED_DATE DATE 
, TOKENIZED_PAN VARCHAR2(20 BYTE) 
, CONSTRAINT XPKT_MW_PAYMENT_TOKEN PRIMARY KEY 
    (
    MW_PAYMENT_TOKEN 
) 
    ENABLE 
) 
+0

你確定你想要選擇'Paymend Token,Transaction ID,Create Date'而不是'Payment Token','Transaction ID','創建日期'和你的列是否一樣?你的桌子怎麼樣? 「t_me_transaction」真的是列名嗎?也許有一些錯字? – Armunin

+1

你能描述一下t_mw_payment_token pt,t_mw_transaction表嗎? – Parado

+0

它看起來像你引用了一個別名「ut」(ut.create_date),但我沒有看到它的表別名... – BWS

回答

0

這裏是解決方案:

SELECT 'Payment Token,Transaction ID,Create Date' 
    FROM dual 
    UNION ALL 
    SELECT 
      mw_payment_token ||','|| 
      mw_transaction_id ||','|| 
      create_date 
     FROM 
      (SELECT 
      DISTINCT 
      pt.mw_payment_token, 
      t.mw_transaction_id, 
      t.create_date 
      FROM t_mw_payment_token pt, 
      t_mw_transaction t 
      WHERE pt.mw_payment_token = t.mw_payment_token 
      ORDER BY t.mw_transaction_id); 
4

你的問題是ORDER BY -clause,因爲它是在整個全球的查詢,不承認t.mw_transaction_id在整個聲明中。
相同的問題:

select 'a' from dual 
union all 
select dummy from dual 
order by dummy; 

您可以通過在兩個給列修復查詢相同的別名:

select 'a' some_col from dual 
union all 
select dummy some_col from dual 
order by some_col; 

但我不認爲這是你想要達到的目標。

編輯
我不知道你要實現你的查詢是什麼,但也許這給你所期望的結果:

SELECT DISTINCT 
     pt.mw_payment_token "Payment Token", 
     t.mw_transaction_id "Transaction ID", 
     t.create_date "Create Date" 
    FROM t_mw_payment_token pt, 
     t_mw_transaction t 
where pt.mw_payment_token = t.mw_payment_token 
order by "Transaction ID"; 

EDIT2
如果你希望你的輸出作爲CSV,可能檢查hereherehere。也許可以考慮在SO上提出另一個問題。
我的建議是使用UTL_FILE包迭代基於我第一次編輯的遊標。但到目前爲止我還沒有嘗試過。

+0

你說得對,我想通過事務ID命令集並輸出一個CSV文件 - 你有什麼建議? –

+0

SELECT'Payment Token,Transaction ID,Create Date',t.mw_transaction_id FROM dual UNION ALL SELECT DISTINCT pt.mw_payment_token ||','|| t.mw_transaction_id ||','|| t.create_date FROM t_mw_payment_token pt,t_mw_transaction t其中pt.mw_payment_token = t.mw_payment_token by t.mw_transaction_id;也給出了相同的錯誤 –

+0

是的,因爲你再也沒有在所有子查詢中使用't.mw_transaction_id'列 – Armunin

1

你想要一個命令的條款只是你的陳述的第二部分。因此:

SELECT 'Payment Token,Transaction ID,Create Date' 
    FROM dual 
UNION ALL 
SELECT * FROM 
( 
    SELECT DISTINCT 
     pt.mw_payment_token ||','|| 
     t.mw_transaction_id ||','|| 
     t.create_date 
    FROM t_mw_payment_token pt, 
     t_mw_transaction t 
    where pt.mw_payment_token = t.mw_payment_token 
    order by t.mw_transaction_id 
); 
+0

他們不一定排序後,你的'SELECT * FROM'據我所知 – Armunin

+0

你的答案給出了以下錯誤:ORA-01791:不是已選擇的表達式 01791. 00000 - 「不是已選擇的表達式」 *原因: *操作: 錯誤在行:15列:12 –

+0

將'alias'賦予計算列,然後在'ORDER BY'中使用它。 – Edper

0

從Thorsten中刪除DISTINCT子句Kettner的答案允許查詢運行。

SELECT 'Payment Token,Transaction ID,Create Date' 
    FROM dual 
UNION ALL 
SELECT * FROM 
( 
    SELECT 
     pt.mw_payment_token ||','|| 
     t.mw_transaction_id ||','|| 
     t.create_date 
    FROM t_mw_payment_token pt, 
     t_mw_transaction t 
    where pt.mw_payment_token = t.mw_payment_token 
    order by t.mw_transaction_id 
); 
+0

這個解決方案的問題是,你不能確定你的結果將被排序爲'SELECT * FROM'可能以隨機順序返回值。對於似乎排序的表是一樣的,只能在最後使用'ORDER BY'子句時保證順序 – Armunin

0

對不起,當我寫其他答案時我很着急。這是一個未經測試但有希望工作的解決方案。首先收集所有記錄,給你的頭低排序鍵。然後排序:

SELECT the_string 
FROM 
(
    SELECT 'Payment Token,Transaction ID,Create Date' as the_string, -1 as sort_key 
    FROM dual 
    UNION ALL 
    SELECT DISTINCT 
      pt.mw_payment_token ||','|| t.mw_transaction_id ||','|| t.create_date as the_string, 
      t.mw_transaction_id as sort_key 
    FROM t_mw_payment_token pt 
    JOIN t_mw_transaction t ON pt.mw_payment_token = t.mw_payment_token 
) 
ORDER BY sort_key 
0

順序由1 或給你列在這兩個查詢一個不錯的別名(僅1事宜),並以通過它