2011-08-25 89 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;