ORACLE-为什么WHERE子句不能用于UNION?

时间:2017-02-14 08:30:07

标签: sql oracle11g

我想要UNION两栏:

  

T1.STATUS,T8.REASON在一列中,WHERE T1.OUTLET_ID = T8.OUTLET_ID   AND T1.ENTRY_DATE = T8.ENTRY_DATE

但是当我在两个表的UNION中添加WHERE子句时,它显示错误:

  

ORA-00904:“T8”。“ENTRY_DATE”:标识符无效

这是我的疑问:

SELECT * FROM
(
    SELECT T1.OUTLET_ID,T1.STATUS,T1.ENTRY_DATE  FROM T_ORDER_DETAIL T1 
    UNION 
    SELECT T8.OUTLET_ID,T8.REASON,T8.ENTRY_DATE FROM  T_NON_PRODUCTIVE_SALES T8 
) 
WHERE T1.OUTLET_ID = T8.OUTLET_ID AND T1.ENTRY_DATE = T8.ENTRY_DATE

问题出在哪里?

4 个答案:

答案 0 :(得分:1)

您可以像这样重写查询:

 SELECT *
   FROM (
 SELECT T1.OUTLET_ID id,
        T1.STATUS res,
        T1.ENTRY_DATE dt 
   FROM T_ORDER_DETAIL T1, 
        T_NON_PRODUCTIVE_SALES T8
  WHERE T1.OUTLET_ID = T8.OUTLET_ID 
    AND T1.ENTRY_DATE = T8.ENTRY_DATE
  UNION 
 SELECT T8.OUTLET_ID id,
        T8.REASON res,
        T8.ENTRY_DATE dt 
   FROM T_ORDER_DETAIL T1, 
        T_NON_PRODUCTIVE_SALES T8
  WHERE T1.OUTLET_ID = T8.OUTLET_ID 
    AND T1.ENTRY_DATE = T8.ENTRY_DATE);

答案 1 :(得分:1)

SELECT * FROM
(
    SELECT T1.OUTLET_ID,T1.STATUS,T1.ENTRY_DATE  FROM T_ORDER_DETAIL T1 
    UNION 
    SELECT T8.OUTLET_ID,T8.REASON,T8.ENTRY_DATE FROM  T_NON_PRODUCTIVE_SALES T8 
) 
WHERE T1.OUTLET_ID = T8.OUTLET_ID AND T1.ENTRY_DATE = T8.ENTRY_DATE

执行查询时,子查询返回一个列名为OUTLET_ID ,STATUS ,ENTRY_DATE的记录表。简而言之,您可以使用这些列获得table

在写入条件的外部查询中

  

WHERE T1.OUTLET_ID = T8.OUTLET_ID和T1.ENTRY_DATE = T8.ENTRY_DATE

Oracle不了解最新的T1T8。因为外部查询将子查询的结果视为table。而且你的桌子上没有这样的名字,所以它给出了错误。正如其他人之前解释的那样,您可以加入并解决您的问题。

答案 2 :(得分:0)

您的子查询只提供一个结果集,因此您不能JOIN这样。而是将您的查询更改为

SELECT T1.OUTLET_ID,T1.STATUS,T1.ENTRY_DATE,
T8.OUTLET_ID,T8.REASON,T8.ENTRY_DATE AS T8_ENTRY_DATE
FROM T_ORDER_DETAIL T1 
JOIN  T_NON_PRODUCTIVE_SALES T8 
ON T1.OUTLET_ID = T8.OUTLET_ID AND T1.ENTRY_DATE = T8.ENTRY_DATE;

答案 3 :(得分:0)

您应该使用INNER JOIN而不是UNION:

SELECT 
    t1.outlet_id, t1.status, t8.status, t1.entry_date
FROM 
    t_order_detail t1 
INNER JOIN 
    t_non_productive_sales t8
ON t1.outlet_id = t8.outlet_id 
    AND t1.entry_date = t8.entry_date;