Как я могу управлять FIFO-очередью в базе данных с помощью SQL? - PullRequest
4 голосов
/ 09 июня 2010

В моей базе данных есть две таблицы: одна для In и одна для Out.У них есть две колонки, Quantity и Price.Как я могу написать SQL-запрос, который выбирает правильную цену?

Например: если у меня есть 3 элемента в для 75, а затем 3 элемента в для 80Тогда у меня есть два out для 75, а третий out должен быть для 75 (X), а четвертый out должен быть для 80 (Y).

Как мне написать запрос цен для X и Y? Они должны использовать цену из третьей и четвертой строки.Например, есть ли способ ВЫБРАТЬ третью строку в таблице In?Я не могу использовать auto_increment в качестве идентификатора для "третьей" строки, потому что таблицы будут содержать записи для других элементов.Строки не будут удалены, они будут сохранены по причинам подотчетности.

SELECT Price FROM In WHERE ...?

NEW дизайн базы данных:

+----+
| In |
+----+------+-------+
| Supply_ID | Price |
+-----------+-------+
|     1     |  75   |
|     1     |  75   |
|     1     |  75   |
|     2     |  80   |
|     2     |  80   |
+-----------+-------+
+-----+
| Out |
+-----+-------+-------+
| Delivery_ID | Price |
+-------------+-------+
|      1      |  75   |
|      1      |  75   |
|      2      |   X   | <- ?
|      3      |   Y   | <- ?
+-------------+-------+

СТАРЫЙ дизайн базы данных:

+----+
| In |
+----+------+----------+-------+
| Supply_ID | Quantity | Price |
+-----------+----------+-------+
|     1     |  3       |  75   |
|     2     |  3       |  80   |
+-----------+----------+-------+

+-----+
| Out |
+-----+-------+----------+-------+
| Delivery_ID | Quantity | Price |
+-------------+----------+-------+
|      1      |  2       |  75   |
|      2      |  1       |   X   | <- ?
|      3      |  1       |   Y   | <- ?
+-------------+----------+-------+

Ответы [ 2 ]

5 голосов
/ 09 июня 2010

Читая комментарии, вы говорите, что готовы добавить автоинкремент или поле даты, чтобы узнать правильную позицию каждой строки.Как только вы добавите это, я бы порекомендовал добавить еще одну строку в таблицу In, называемую обработанной, которая автоматически устанавливается в значение false, когда строка добавляется в таблицу.Для всех строк, которые были скопированы в OUT, для их обработанного поля установлено значение true.

+----+
| In |
+-----------+-----------+-------+-----------+
| AUtoId    | Supply_ID | Price | Processed |
+-----------+-----------+-------+-----------+
|     1     |     1     |  75   |     1     |
|     2     |     1     |  75   |     1     |
|     3     |     1     |  75   |     0     |
|     4     |     2     |  80   |     0     |
|     5     |     2     |  80   |     0     |
+-----------+-----------+-------+---------- +

Затем, чтобы найти следующий элемент для перемещения в OUT, вы можете выполнить

SELECT TOP 1 Supply_ID, Price 
FROM In WHERE Processed = 0
ORDER BY [Your Auto Increment Field or Date]

.строка перемещается в OUT, затем вы просто ОБНОВЛЯЕТЕ обработанное поле этой строки в true.

0 голосов
/ 09 июня 2010

Я не вижу простой запрос, который бы здесь помог. Чтобы имитировать FIFO в SQL, я бы посмотрел на три таблицы: OPERATION, OUT и FIFO. Операция - это, по сути, журнал транзакций, а таблица FIFO - это состояние FIFO, а OUT - ответы от FIFO.

Вы должны обновить CURRENT операциями (добавление и удаление элементов) по мере их поступления в таблицу OPERATION и обрабатывать запросы на выход элементов в таблицу OUT, уменьшая значения в FIFO и, при необходимости, удаляя записи из таблицы FIFO. .

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

...