Поиск пар, которые не существуют в другой таблице - PullRequest
10 голосов
/ 28 марта 2011

У меня есть таблица (заказы) с идентификатором заказа, местоположением 1, местоположением 2 и другой таблицей (пробегом) с местоположением 1 и местоположением 2.

Я использую действие «Кроме», чтобы вернуть эти пары местоположений в заказах, которые не указаны в милях. Но я не уверен, как можно также вернуть соответствующий order_id, который принадлежит этим парам (order_id не существует в таблице миль). Единственное, о чем я могу думать, это иметь внешний оператор выбора, который ищет заказы для этих пар местоположений. Я не пробовал, но я ищу другие варианты.

У меня есть что-то вроде этого.

SELECT location_id1, location_id2  
FROM orders 
except
SELECT lm.origin_id, lm.dest_id
from mileage

Как мне также получить идентификатор заказа для этих пар?

Ответы [ 5 ]

18 голосов
/ 28 марта 2011

Вместо этого вы можете попробовать использовать оператор Not Exists:

Select O.order_id, O.location_id1, O.location_id2
From orders As O
Where Not Exists    (
                    Select 1
                    From mileage As M1
                    Where M1.origin_id = O.location_id1
                        And M1.dest_id = O.location_id2
                    )

Другое решение, если вы действительно хотите использовать Except

Select O.order_id, O.location_id1, O.location_id2
From Orders As O
Except
Select O.order_id, O.location_id1, O.location_id2
From Orders As O
    Join Mileage As M
        On M.origin_id = O.location_id1
            And M.dest_id = O.location_id2
2 голосов
/ 28 марта 2011

Вы можете использовать left-external-join к таблице миль и возвращать только те строки, которые не объединяются. Вот так:

select O.order_id, O.location_id1, O.location_id2
from orders O left outer join mileage M1 on
  O.location_id1 = M1.origin_id and
  O.location_id2 = M1.dest_id
where M1.origin_id is NULL
1 голос
/ 29 марта 2011

Я думал, что это так, но, как указал Гейб, это НЕ работает в SQL-Server 2008:

SELECT order_id
     , location_id1
     , location_id2  
FROM orders 
WHERE (location_id1, location_id2) NOT IN
  ( SELECT origin_id, dest_id
    FROM mileage
  )

Будет ли это решение с EXCEPT (которое фактически является СОЕДИНЕНИЕМ между вашим исходным запросом и Заказами) работать быстро или ужасно? Понятия не имею.

SELECT o.order_id, o.location_id1, o.location_id2  
FROM orders o
  JOIN
    ( SELECT location_id1, location_id2  
      FROM orders 
      except
      SELECT origin_id, dest_id
      FROM mileage
    ) AS g
    ON o.location_id1 = g.location_id1
    AND o.location_id2 = g.location_id2
1 голос
/ 28 марта 2011

Если вы хотите получить пары, которых нет в таблице миль, вы можете сделать что-то вроде

select location_id1, location_id2
from orders
where (select count(*) from mileage 
       where mileage.origin_id = location_id1 and mileage.dest_id = location_id2) = 0
0 голосов
/ 31 июля 2011

MySQL не поддерживает, кроме.Для тех, кто сталкивается с этим вопросом, используя MySQL, вот как вы это делаете:

http://nimal.info/blog/2007/intersection-and-set-difference-in-mysql-a-workaround-for-except/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...