2013-12-09 54 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事宜),并以通过它