morto
@morto
вечный ученик

Какой sql запрос построить?

Построить таблицу с номерами поставщиков и парами номеров деталей, таких, что некоторый поставщик поставляет обе указанные детали. При этом пары вида P1 и P2, а также P2 и P1 считать одинаковыми.

Получилось построить такой запрос, но как учесть
При этом пары вида P1 и P2, а также P2 и P1 считать одинаковыми.
не знаю :(

Запрос
SELECT DISTINCT t1.номер_поставщика, t1.номер_детали, t2.номер_детали FROM SPJ as t1
join SPJ as t2 on t1.номер_поставщика = t2.номер_поставщика 
and t1.номер_детали != t2.номер_детали AND t2.номер_детали != t1.номер_детали


БД:
БД

629ddf2ed65a3870030826.jpeg


Структура БД

create TABLE S(номер_поставщика varchar(6) NOT NULL,фамилия text, рейтинг int, город text, PRIMARY KEY (номер_поставщика) );
create TABLE P(номер_детали varchar(6) NOT NULL,название text,цвет text, вес Int, город TEXT, PRIMARY KEY (номер_детали));
create TABLE J(номер_изделия varchar(6) NOT NULL,название Text,город TEXT, PRIMARY KEY (номер_изделия));
create TABLE SPJ(
    номер_поставщика varchar(6) NOT NULL,
    номер_детали varchar(6) NOT NULL,
    номер_изделия varchar(6) NOT NULL, 
    количество Int,
    CONSTRAINT `fk_spj_s`
    FOREIGN KEY (номер_поставщика) REFERENCES S (номер_поставщика)
    ON DELETE CASCADE
    ON UPDATE RESTRICT,
    CONSTRAINT `fk_spj_p`
    FOREIGN KEY (номер_детали) REFERENCES P (номер_детали)
    ON DELETE CASCADE
    ON UPDATE RESTRICT,
    CONSTRAINT `fk_spj_j`
    FOREIGN KEY (номер_изделия) REFERENCES J (номер_изделия)
    ON DELETE CASCADE
    ON UPDATE RESTRICT);

Insert INTO S VALUES 
	("S1", "Смит", 20, "Лондон"),
	("S2", "Джонс", 10, "Париж"),
   	("S3", "Блейк", 30, "Париж"),
    ("S4", "Кларк", 20, "Лондон"),
    ("S5", "Адамс", 30, "Афины");

Insert INTO P VALUES 
	("P1", "Гайка", "Красный", 12, "Лондон"),
	("P2", "Болт", "Зеленый", 17, "Лондон"),
    ("P3", "Винт", "Голубой", 17, "Лондон"),
    ("P4", "Винт", "Красный", 14, "Лондон"),
   	 ("P5", "Кулачок", "Голубой", 12, "Лондон"),
    ("P6", "Блюм", "Красный", 19, "Лондон");

Insert INTO J VALUES 
	("J1", "Жесткий диск", "Париж"),
	("J2", "Перфоратор", "Рим"),
  	("J3", "Считыватель", "Афины"),
    ("J4", "Принтер", "Афины"),
   	("J5", "Флоппи-диск", "Лондон"),
    ("J6", "Терминал", "Осло"),
    ("J7", "Лента", "Лондон");

Insert INTO SPJ VALUES 
	("S1", "P1", "J1", 200),
    ("S1", "P1", "J4", 700),
    ("S2", "P3", "J1", 400),
    ("S2", "P3", "J2", 200),
    ("S2", "P3", "J3", 200),
    ("S2", "P3", "J4", 500),
    ("S2", "P3", "J5", 600),
    ("S2", "P3", "J6", 400),
    ("S2", "P3", "J7", 800),
    ("S2", "P5", "J2", 100),
    ("S3", "P3", "J1", 200),
    ("S3", "P4", "J2", 500),
    ("S4", "P6", "J3", 300),
    ("S4", "P6", "J7", 300),
    ("S5", "P2", "J2", 200),
    ("S5", "P2", "J4", 100),
    ("S5", "P5", "J5", 500),
    ("S5", "P5", "J7", 100),
    ("S5", "P6", "J2", 200),
    ("S5", "P1", "J4", 100),
    ("S5", "P3", "J4", 200),
    ("S5", "P4", "J4", 800),
    ("S5", "P5", "J4", 400),
    ("S5", "P6", "J4", 500);

  • Вопрос задан
  • 324 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
and t1.номер_детали != t2.номер_детали AND t2.номер_детали != t1.номер_детали
заменить на
and t1.номер_детали < t2.номер_детали
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы