Извлечение недостающих данных из той же таблицы

Я импортирую файлы CSV с отсутствующими данными в таблицу MariDB. Мне нужно найти все коды, у которых нет соответствующего place = 2.

Table cityX
| id | code | place | value | description | subcode | 
| 1  | 001x |  1    |  6.00 | unique str  |   A     |
| 2  | 002x |  1    |  2.23 | diff string |   B     |
| 3  | 003x |  1    |  2.23 | another str |   B     |

Каждый code в таблице должен иметь повторяющуюся строку с place = 1 и place = 2

| id | code | place | value | description | subcode |
| 1  | 001x |  1    |  6.00 | unique str  |   A     |
| 2  | 001x |  2    |  6.00 | unique str  |   A     |

Я использовал варианты операторов select ... except, чтобы изолировать коды с различным количеством ошибочных полей.

Используя SELECT [code] FROM cityX WHERE place = '1' EXCEPT SELECT [code] FROM cityX where place = '2', создайте временную таблицу и объедините оставшиеся поля place, value, description и subcode для получения недостающих кодов. Я получаю самый отсутствующих записей, но также добавляю дубликаты.

Как я могу правильно выбрать и вставить строки, в которых отсутствует place = 2

🤔 А знаете ли вы, что...
MySQL - это популярная система управления реляционными базами данных (СУБД).


29
2

Ответы:

Решено

Это решение позволяет избежать EXCEPT, который не работает во всех СУБД (не уверен в mysql).

SELECT CODES.code,
       CODE_W_1.place AS place_1,
       CODE_W_2.place AS place_2
FROM   (SELECT code
        FROM   cityx
        GROUP  BY code) AS CODES
       LEFT OUTER JOIN (SELECT code,
                               place
                        FROM   cityx
                        WHERE  place = 1
                        GROUP  BY code) AS CODE_W_1
                    ON CODES.code = CODE_W_1.code
       LEFT OUTER JOIN (SELECT code,
                               place
                        FROM   cityx
                        WHERE  place = 2
                        GROUP  BY code) AS CODE_W_2
                    ON CODES.code = CODE_W_2.code
WHERE  code_w_1 IS NULL
        OR CODE_W_2.code IS NULL 

У меня нет доступа к mysql, чтобы проверить это, но я получил это от Расго, который автоматически пишет SQL.


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

create table cityX (
  id int primary key not null auto_increment,
  code char(5),
  place int );
insert into cityX (code, place) values

('001x',1),('001x',2),('002x',1),('003x',2);

select * from cityX
order by code, place;
id | code | place
-: | :--- | ----:
 1 | 001x |     1
 2 | 001x |     2
 3 | 002x |     1
 4 | 003x |     2
insert into cityX (code, place)
select x.code,1 from cityX x
where place = 2
and not exists
(select id from cityX c
where c.code = x.code
and place = 1);
insert into cityX (code, place)
select x.code,2 from cityX x
where place = 1
and not exists
(select id from cityX c
where c.code = x.code
and place = 2);
select * from cityX
order by code, place;
id | code | place
-: | :--- | ----:
 1 | 001x |     1
 2 | 001x |     2
 3 | 002x |     1
 6 | 002x |     2
 5 | 003x |     1
 4 | 003x |     2

дб <> рабочий пример здесь