Поиск данных по двум столбцам SQL - PullRequest
0 голосов
/ 04 мая 2020

У меня есть таблица базы данных, подобная этой:

Id          Tipo        Provincia
RTOR-0246   INVENTARIO  MADRID
RTOR-0246   SUSTRATO    MADRID
RTOR-0247   INVENTARIO  MADRID
RTOR-0252   INVENTARIO  MADRID
RTOR-0255   SUSTRATO    MADRID
RTOR-0261   SUSTRATO    MADRID

Мне нужен поиск по идентификаторам, у которых нет Tipo = Inventario, и создайте новую строку с этими данными, я имею в виду, например, RTOR-00261 и RTOR-0255 не имеют INVENTARIO, мне нужно создать новое с полями, которые есть в SUSTRATO. Все данные находятся в одной таблице

Конечный выход, подобный этому:

Id          Tipo        Provincia
RTOR-0246   INVENTARIO  MADRID
RTOR-0246   SUSTRATO    MADRID
RTOR-0247   INVENTARIO  MADRID
RTOR-0252   INVENTARIO  MADRID
RTOR-0255   SUSTRATO    MADRID
RTOR-0261   SUSTRATO    MADRID
RTOR-0255   INVENTARIO  MADRID
RTOR-0261   INVENTARIO  MADRID

Я пробовал с:

SELECT Id 
FROM my_table 
WHERE NOT EXISTS (SELECT NULL FROM my_table WHERE id != id)

Не работает

Другое:

SELECT Id 
FROM my_table as t1
WHERE NOT EXISTS (SELECT Administrativo FROM my_table where Tipo='INVENTARIO') as sq
where T t1.Tipo='SUSTRATO' and t1.Id=sq.Id

Не работает также.

Мне нужна помощь с этим - есть идеи?

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Эти два решения работают (вы были очень близки):

С подзапросом:

SELECT `Id` 
FROM `my_table`
WHERE NOT EXISTS (SELECT 1 FROM `my_table` AS `sub` WHERE `sub`.`Id` = `my_table`.`Id` AND `sub`.`Tipo` = 'INVENTARIO');

С левым соединением:

SELECT `my_table`.`Id` 
FROM `my_table` LEFT JOIN
`my_table` AS `Inventario` ON (`Inventario`.`Id` = `my_table`.`Id` AND `Inventario`.`Tipo` = 'INVENTARIO')
WHERE `Inventario`.`Id` IS NULL;

DB Fiddle

Edit : Я тоже думаю, что вопрос должен быть другим. Больше похоже на «Как выбрать строки, которые не соответствуют критериям в одной таблице» или около того. Вопрос «данные поиска, основанные на двух столбцах» слишком широк, на него можно ответить «ГДЕ ... И ...».

0 голосов
/ 04 мая 2020

Вам необходим UNION ALL для 2 случаев, а НЕ СУЩЕСТВУЕТ:

SELECT Id, Tipo, Provincia 
FROM my_table 
UNION ALL
SELECT m.Id, 'INVENTARIO', m.Provincia
FROM my_table m
WHERE Tipo = 'SUSTRATO'
AND NOT EXISTS (
  SELECT 1 FROM my_table 
  WHERE id = m.id AND Tipo = 'INVENTARIO'
)

См. Демоверсию . Результаты:

| Id        | Tipo       | Provincia |
| --------- | ---------- | --------- |
| RTOR-0246 | INVENTARIO | MADRID    |
| RTOR-0246 | SUSTRATO   | MADRID    |
| RTOR-0247 | INVENTARIO | MADRID    |
| RTOR-0252 | INVENTARIO | MADRID    |
| RTOR-0255 | SUSTRATO   | MADRID    |
| RTOR-0261 | SUSTRATO   | MADRID    |
| RTOR-0255 | INVENTARIO | MADRID    |
| RTOR-0261 | INVENTARIO | MADRID    |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...