2011-08-25 123 views
1

我有以下表格:Oracle查询:如何从此查询中取消多个结果?

CLIENT 
- ID 
- NAME 
- USER 

ORDER 
- ID 
- DATE 
- CLIENT_ID 
- USER 

ORDER_LINE 
- ORDER_ID 
- LINE_ID 
- USER 

用户现场跟踪谁最后修改记录的人。此外,每个订单项可能会被不同的用户修改。

我试图找出来,给一个用户,有什么吩咐他们已经参与了。

select 
client.id, 
client.name, 
order.id, 
order.date, 
case 
    when order_line.user = :user then 'Line Item' 
    when order.user = :user then 'Order' 
    when client.user = :user then 'Client' 
end 
from 
order_line 
join order on order_id = order.id 
join client on order.client_id = client.id 
where 
order_line.user = :user 
or order.user = :user 
or client.user = :user 

问题是,用户可能同时触摸order和order_line表,所以我得到多个结果。添加select distinct不会有帮助,因为case语句的结果在每种情况下都不相同。

有没有办法来重组查询,所以我只有每个订单得到一个结果?

case语句的结果是不是真的那么重要 - 这将是很好,如果我能在别人摸两个表,但只是“行项目”的情况下,得到“行项目,令”将确定。

+1

那么案例陈述并不重要?或者,如果您希望每个订单有一行,您会如何选择不同的案例? – Jacob

+0

@cularis:我通过澄清更新了问题。 – chris

回答

0

我提出这个

这将显示该用户改变所有的订单,如果他改变线项目,但不是行项目

SELECT client.id, 
     client.name, 
     order.id, 
     order.date 
    FROM  order 
     JOIN 
      client 
     ON client_id = client.id 
WHERE  order.USER = :USER 
     OR client.USER = :USER 
     OR :USER IN (SELECT USER 
         FROM ORDER_LINE OL 
         WHERE ORDER_LINE.ORDER_ID = ORDER.ID) 
+0

这似乎是最简单的,我也可以在那里添加一个case语句。 – chris

0

Oracle是否已经GROUP_CONCAT(或相似)MySQL有?

select client_id, name, order_id, date, group_concat(what separator ', ') as changes 
from (
select 
client.id as client_id, 
client.name, 
order.id as order_id, 
order.date, 
case 
    when order_line.user = :user then 'Line Item' 
    when order.user = :user then 'Order' 
    when client.user = :user then 'Client' 
end as what 
from 
order_line 
join order on order_id = order.id 
join client on order.client_id = client.id 
where 
order_line.user = :user 
or order.user = :user 
or client.user = :user 
) as part1 
group by client_id, name, order_id, date; 
+0

似乎有类似的东西,但我不熟悉不够与这些类型的结构来了解这是怎么回事:http://tkyte.blogspot.com/2006/08/evolution.html – chris

+0

我也发现(视oracle版本)LISTAGG和WM_CONCAT作为group_concat的直接替换(最后没有被oracle记录)。 [这里](http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php)是这两者与其他技术 –

0

如何串联的最后一列,并使用不同的,这样的事情:

select distinct 
client.id, 
client.name, 
order.id, 
order.date, 
case when order_line.user = :user then 'Line Item ' else '' end || 
    case when order.user = :user then 'Order ' else '' end || 
    case when client.user = :user then 'Client ' else '' end 
from 
order_line 
join order on order_id = order.id 
join client on order.client_id = client.id 
where 
order_line.user = :user 
or order.user = :user 
or client.user = :user 

+0

简要我还是最终与2分的结果:一个只有“订单”,一个'订单项' – chris

+0

嗯 - 我想你可能想添加用户到连接中,例如:从 order_line 加入订单order_id = order.id和order_line.user = order.user 加入订单的客户。 client_id = client.id和order.user = client.user' –

0

尝试类似如下:

select client_id, 
     max(client_name), 
     order_id, 
     max(order_date), 
     max(Line_User), 
     max(Order_User), 
     max(Client_User) 
(select client.id client_id, 
     client.name client_name, 
     order.id order_id, 
     order.date order_date, 
     case when order_line.user = :user then 'Y' else 'N' end Line_User, 
     case when order.user = :user then 'Y' else 'N' end Order_User, 
     case when client.user = :user then 'Y' else 'N' end Client_User 
from order_line 
join order on order_id = order.id 
join client on order.client_id = client.id 
where order_line.user = :user or order.user = :user or client.user = :user) 
group by client_id, order_id;