Как выбрать строки без совпадения между двумя таблицами в SQL? - PullRequest
1 голос
/ 08 марта 2019

У меня есть две таблицы t1 и t2

t1

plant  country    cost
------------------------
apple  usa        1
apple  uk         1
potato sudan      3
potato india      3
potato china      3
apple  usa        2
apple  uk         2


t2

country
--------
usa
uk
egypt
sudan
india
china

Мне нужно вернуть таблицу для стран, которые не существуют в t1, например:

plant  country    cost
------------------------
apple  egypt      1
apple  sudan      1
apple  india      1
apple  china      1
apple  egypt      2
apple  sudan      2
apple  india      2
apple  china      2
potato usa        3
potato uk         3
potato egypt      3

Это кажется таким простым, но я не могу решить это. Я попробовал:

select t1.plant, t2.country, t1.cost
from t1
right outer join t1 on t1.country = t2.country
where t2 is null
group by t1.plant, t2.country, t1.cost

Я рассмотрел несколько вопросов «не существует» при переполнении стека, но ответы не сработали, потому что между t1 и t2 было больше общих столбцов, чем в моем примере. Может ли кто-нибудь указать мне правильное направление или показать ссылку на подобную проблему?

Ответы [ 3 ]

2 голосов
/ 08 марта 2019

Мы можем попытаться справиться с этим с помощью таблицы календаря «на лету»:

WITH cte AS (
    SELECT DISTINCT t1.plant, t2.country, t1.cost
    FROM t1
    CROSS JOIN t2
)

SELECT
    a.plant,
    a.country,
    a.cost
FROM cte a
WHERE NOT EXISTS (SELECT 1 FROM t1 b
                  WHERE a.plant = b.plant AND
                        a.country = b.country AND
                        a.cost = b.cost);

Демо

0 голосов
/ 08 марта 2019
SELECT t.plant, t2.country, t.cost
FROM(
SELECT DISTINCT plant , cost
FROM t1)t
CROSS JOIN t2
LEFT JOIN t1 ON t1.plant = t.plant and t1.country = t2.country AND t.cost = t1.cost
WHERE t1.plant IS NULL AND t1.country IS NULL AND t1.cost is NULL
0 голосов
/ 08 марта 2019

Вы можете использовать CROSS JOIN для генерации всех возможных комбинаций plants и countires, затем условие NOT EXISTS с коррелированным подзапросом, чтобы отфильтровать те, которые существуют в t2:

select plants.plant, countries.country, plants.cost
from t2 countries
cross join (distinct plant, max(cost) cost from t1 group by plant) plants
where not exists (
    select 1 from t1 where t1.country = countries.country
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...