Никогда не помещайте несколько значений в одно поле с разделителем. Это создает все виды головных болей. Как вы будете искать на таком поле? Как вы будете делать соединения? Как механизм базы данных будет индексировать его? Вы должны сделать целую кучу обработки строк. Это плохие новости.
Я вижу два возможных решения, в зависимости от того, что именно является реальным требованием.
Secnario 1: Если реальное требование таково: «Клиент может сказать, что он не хочет вызываться до тех пор, пока не будут завершены все незавершенные ремонты», тогда все, что вам нужно, это поле в таблице клиента, которое является логическим » не звоните, если какой-либо ремонт не завершен ". Тогда запрос вызова становится примерно таким:
select customername, whatever
from customer
join repair rc on rc.customerid=customer.customerid and rc.completed=true and rc.pickedup=false
where customer.allOrNothing=false
or not exists
(select 1 from repair ri where ri.customerid=customer.customerid and ri.completed=false)
Сценарий 2: Вам действительно нужно связать ремонт в произвольных комбинациях. т. е. клиент может сказать, что он не хочет, чтобы его вызвали на ремонт 1 или 3, пока оба не будут выполнены, и он не хочет, чтобы его вызывали на 2 или 5, пока оба не будут выполнены, но их можно было бы вызвать даже на 4 если ничего из этого не сделано, или для 1 и 3, или для 2 и 5. Казалось бы, что клерк очень сложно вводит и поддерживает данные, но все в порядке.
Вам понадобится новая таблица, назовем ее RepairTies. Эта таблица имеет два столбца: RepairTieId и RepairId. Всякий раз, когда вы создаете такую связь, вы создаете одну запись в RepairTies для каждого ремонта в «связанном наборе». Вы создаете RepairTieId для идентификации набора. Значение RepairTieId ничего не значит само по себе: это просто что-то, что связывает записи о восстановлении - «опорная точка», если хотите. Это необходимо, чтобы вы могли прикрепить все записи о ремонте к чему-то, что не зависит от отдельной записи о ремонте. (Обратите внимание, что вы не хотите связывать ремонт № 2 с ремонтом № 1. Что делать, если есть три связанных ремонта, поэтому вы связываете № 2 и № 3 с № 1. Затем пользователь говорит: «О, подождите, № 1 не должен» Если вы были в этом списке, удалите его. Теперь № 2 и № 3 привязаны к ... чему? Вы не хотите потерять тот факт, что № 2 и № 3 связаны только потому, что № 1 исчез.)
Тогда запрос становится:
select customername, whatever
from customer
join repair rc on rc.customerid=customer.customerid and rc.completed=true and rc.pickedup=false
where not exists
(select 1 from repairtie t1
join repairtie t2 on t1.repairtieid=t2.repairtieid and t2.completed=false
where t1.repairid=rc.repairid)
Обычный отказ от ответственности: я не проверял ничего из этого, все это у меня в голове, поэтому могут быть ошибки в деталях, но принцип должен работать.