Я импортирую файлы 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 - это популярная система управления реляционными базами данных (СУБД).
Это решение позволяет избежать 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
дб <> рабочий пример здесь