У меня есть таблица, где мне нужно обновить или вставить в зависимости от параметров поля - PullRequest
1 голос
/ 04 февраля 2020

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

Итак, вот моя дилемма. У меня есть таблица оборудования, которая отслеживает замену масла для определенных единиц c в базе данных. Таблица выглядит следующим образом:

     **id   UnitID   Posted_On    Date_Completed     Note     OverDueBy**
      1 BT-109F  2019-02-04   2019-02-14       Hrs  Overdue   23 
      1 BT-108G  2020-01-17   2020-01-22       Days Overdue   12
      1 BT-122K  2020-01-02   2020-01-16       Days Overdue   12
      1 BT-109F  2019-02-04                    Days Overdue   3 

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

Я хочу, чтобы запрос выполнялся, проверьте, есть ли у указанного c блока запись, в которой «Date_Completed» поле пустое, и если это так, обновите поле 'OverDueBy', чтобы отразить новое значение. Если во всех записях для указанного модуля заполнены поля 'Date_Completed', то запрос должен создать новую запись, будут ли заполнены все поля, кроме поля 'Date_Completed'.

Может кто-нибудь помочь мне сконструировать такой запрос?

Спасибо, Клан

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Сначала создайте уникальный частичный индекс для столбца UnitID:

CREATE UNIQUE INDEX idx_unit ON tablename(UnitID) 
WHERE Date_Completed IS NULL;

, чтобы для каждой UnitID была разрешена только 1 строка с Date_Completed=null. Таким образом, выражение, подобное этому:

INSERT INTO tablename(id, UnitID, Posted_On, Date_Completed, Note, OverDueBy)
VALUES (?, 'BT-109F', ?, null, ?, ?)
ON CONFLICT(UnitID) WHERE Date_Completed IS NULL DO UPDATE
SET OverDueBy = ?;

будет вставлять новые значения, только если для UnitID='BT-109F' уже нет строки с null в Date_Completed. Но если такая строка есть, она обновит столбец OverDueBy. Я не уверен, какие значения вы хотите вставить или какое будет обновленное значение, поэтому замените ? на соответствующие значения.

0 голосов
/ 04 февраля 2020

Я думаю, вам нужно что-то вроде этого:

MERGE INTO EQUIPMENT A 
USING (SELECT * FROM EQUIPMENT B WHERE DATE_COMPLETED IS NULL) C 
ON (A.UNITID=C.UNITID)
WHEN MATCHED THEN UPDATE SET  A.OVERDUEBY="new value"
WHEN NOT MATCHED THEN INSERT (A.id,A.UnitID,A.Posted_On,A.Date_Completed,A.Note,A.OverDueBy)
VALUES (C.id,C.UnitID,C.Posted_On,NULL,C.Note,C.OverDueBy)

Не уверен, откуда появятся новые значения из обновления. Это не ясно в вашем вопросе. Но что-то подобное может сработать.

0 голосов
/ 04 февраля 2020

Во-первых, я бы использовал представление, а не таблицу, чтобы хранить любые вычисленные данные - это уменьшает накладные расходы хранилища и будет обновлять вычисления при каждом открытии представления. Если вы используете SQLite, вы должны быть в состоянии получить просрочку, вычтя Posted_On из его функции, чтобы вернуть сегодняшнюю дату, например, date('now') или julianday('now') - прочитайте и протестируйте функции, чтобы убедиться, что они выполняют то, что вы хотите. Таким образом, в соответствии с: -

create view MyView as select *,  julianday('now') - julianday(Posted_On) as OverDueBy from ClansTable where Date_Completed is null; 

Если вы хотите сохранить снимок, вы всегда можете создать таблицу из представления в любом случае: -

create table MyStoredOverduesOn4thFeb as select * from MyView;

Вы можете найти свой Единицы, которые имеют все Date_Completed и создают одну новую запись, например так: -

Create table CompletedUnits as select id, UnitID, max(posted_on) as latest_posted_on, '' as Date_Completed from ClansTable group by id, UnitID having count(*) = count(Date_Complete); 

Проверьте это SQL и посмотрите, сможете ли вы заставить его работать - заметьте, я создал текстовое поле для даты. Очевидно, что нет типа данных дата / дата / время как такового: -

https://www.sqlitetutorial.net/sqlite-date/

Надеюсь, это поможет,

Фил

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