SQL-запрос для перечисления всех записей, где все значения для одного столбца не находятся в другом столбце

0

Извините, вопрос слишком расплывчатый. Я объясню это здесь. Итак, у меня есть две таблицы: R и S.
Есть 10 продуктов P1, P2............... P10, и каждый продукт может иметь 5 типов T1, T2, T3, T4, T5.

Таблица R представляет собой таблицу с двумя столбцами, которая сортируется по продуктам.

Products   Type

P1         T1
P1         T3
P1         T4
P2         T2
P2         T3
P3         T1
.          .
.          .
.          .

Таким образом, R - это таблица, которая сортируется по продуктам и описывает, какой тип каждого продукта из пяти доступен.
S - другая таблица всех 5 типов.

Type

T1        
T2         
T3         
T4         
T5

Мне нужно узнать List из всех типов, которые недоступны для определенного продукта.

Таким образом, результат должен быть:

Products   Type

    P1         T2
    P1         T5
    P2         T1
    P2         T4
    P2         T5
    .          .
    .          .
    .          .
    .          .

SInce P1 не имеет T2 и T5 в таблице R, он должен быть включен в результат.

Как я могу это достичь? Я пробовал использовать Left Join, но я не могу найти правильный ответ.

Помощь будет оценена. !!!

  • 0
    Для начала: должно быть три таблицы: products, types (ваша таблица S) и product_types (ваша таблица R). Затем вы должны объединить продукты и типы, чтобы получить все возможные комбинации, и из них вы удалите существующие. Без таблицы продуктов вы должны были бы генерировать ее на лету, потому что без этой таблицы десять продуктов существуют только в вашей голове; было бы невозможно с двумя таблицами только найти продукт, не имеющий всех типов.
Теги:
database

3 ответа

1

Вы используете cross join для генерации всех строк, а затем отфильтровываете те, которые существуют:

select p.product, t.type
from (select distinct product from producttypes) p cross join
     types t left join
     producttypes pt
     on pt.product = p.product and pt.type = t.type
where pt.type is null;

Конечно, если у вас есть таблица со всеми продуктами, вы можете использовать ее для p вместо подзапроса.

  • 0
    У меня есть таблица R, в которой присутствует каждый продукт из 10, нужен ли мне подзапрос?
  • 0
    @Ravikumar. , , Это то, что означает последний комментарий.
0
create table product(
    product_id varchar(10) not null,
    product_type varchar(10) not null
);
go

insert into product values
('P1','T1'),
('P1','T3'),
('P1','T4'),
('P2','T2'),
('P2','T3'),
('P3','T1');
go

create table productType(
    type_id varchar(10) not null,
);
go

insert into productType values
('T1'),('T2'),('T3'),('T4'),('T5'),('T6'),('T7')

select * from product
select * 
    from 
        (select distinct(product_id) from product) as a 
        cross join 
        (select distinct(type_id) from productType) as b
 except (select * from product)
0

Я бы использовал CROSS JOIN и NOT EXISTS

select DR.product, 
       S.type
from (select distinct product from R) DR 
cross join types S
where not exists (
   select 1
   from R
   where R.product = DR.product and 
         R.type = S.type
)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню