Запрос Oracle: как я могу исключить несколько результатов из этого запроса? - PullRequest
1 голос
/ 25 августа 2011

У меня есть следующие таблицы:

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 и line_line, поэтому я получаю несколько результатов. Добавление SELECT не помогает, так как результат оператора case различен в каждом случае.

Есть ли способ реструктурировать запрос, чтобы я получал только один результат за заказ?

Результат оператора case на самом деле не так важен - было бы неплохо, если бы я мог получить «Позиция, порядок», если кто-то дотронется до обеих таблиц, но просто «Позиция» будет в порядке.

Ответы [ 4 ]

0 голосов
/ 25 августа 2011

Попробуйте что-то вроде следующего:

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;
0 голосов
/ 25 августа 2011

Как насчет объединения последнего столбца и использования различных, что-то вроде этого:

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 голосов
/ 25 августа 2011

Я предлагаю это

Он покажет все заказы, которые пользователь изменил, и если он изменил позиции, но не какие позиции

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 голосов
/ 25 августа 2011

имеет ли оракул 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...