Существует большая таблица транзакций. Я скопировал все транзакции для определенного элемента в другую таблицу (с именем TransactionsTest) с теми же точными столбцами, для которых я тестировал.
Таблица Tranactions выглядит следующим образом:
+----------------+--------------+---------------------+-------------+----------------------+
| Transaction_ID | Inventory_ID | Transaction_DT | Location_ID | Transaction_Quantity |
+----------------+--------------+---------------------+-------------+----------------------+
| 39993 | 302 | 2017-01-26 12:41:00 | 1 | 2 |
| 39964 | 112 | 2017-01-26 9:55:00 | 20 | 1 |
| 39890 | 417 | 2017-01-20 9:54:00 | 3 | 5 |
| 39794 | 302 | 2017-01-11 9:50:00 | 3 | 3 |
| 39790 | 302 | 2017-01-10 10:45:00 | 20 | 2 |
| 39681 | 225 | 2017-01-02 8:32:00 | 20 | 4 |
| 39682 | 227 | 2017-01-02 8:15:00 | 1 | 1 |
| 39679 | 302 | 2017-01-01 11:23:00 | 3 | 6 |
| 39599 | 302 | 2016-12-11 10:21:00 | 1 | 2 |
+----------------+--------------+---------------------+-------------+----------------------+
Таким образом, таблица TransactionsTest, содержащая только транзакции для определенного элемента, выглядит следующим образом:
+----------------+--------------+---------------------+-------------+----------------------+
| Transaction_ID | Inventory_ID | Transaction_DT | Location_ID | Transaction_Quantity |
+----------------+--------------+---------------------+-------------+----------------------+
| 39993 | 302 | 2017-01-26 12:41:00 | 1 | 2 |
| 39794 | 302 | 2017-01-11 9:50:00 | 3 | 3 |
| 39790 | 302 | 2017-01-10 10:45:00 | 20 | 2 |
| 39679 | 302 | 2017-01-01 11:23:00 | 3 | 6 |
| 39599 | 302 | 2016-12-11 10:21:00 | 1 | 2 |
+----------------+--------------+---------------------+-------------+----------------------+
Я построил 2 разных запроса для возврата только самой последней транзакции в каждое местоположение. Вот первое:
SELECT t1.*
FROM TransactionsTest t1
WHERE t1.Transaction_DT = (SELECT MAX(t2.Transaction_DT)
FROM TransactionsTest t2
WHERE t2.Location_ID = t1.Location_ID)
AND Inventory_ID = 302 ORDER BY t1.Transaction_DT
А вот и второе:
SELECT t1.*
FROM TransactionsTest t1
WHERE t1.Transaction_ID = (SELECT TOP 1 t2.Transaction_ID
FROM TransactionsTest t2
WHERE t2.Location_ID = t1.Location_ID
ORDER BY t2.Transaction_ID DESC)
AND Inventory_ID = 302 ORDER BY t1.Transaction_DT
Оба запроса возвращают этот результат при запросе TransactionsTest:
+----------------+--------------+---------------------+-------------+----------------------+
| Transaction_ID | Inventory_ID | Transaction_DT | Location_ID | Transaction_Quantity |
+----------------+--------------+---------------------+-------------+----------------------+
| 39993 | 302 | 2017-01-26 12:41:00 | 1 | 2 |
| 39794 | 302 | 2017-01-11 9:50:00 | 3 | 3 |
| 39790 | 302 | 2017-01-10 10:45:00 | 20 | 2 |
+----------------+--------------+---------------------+-------------+----------------------+
Но когда я запускаю те же запросы для таблицы транзакций, например:
SELECT t1.*
FROM Transactions t1
WHERE t1.Transaction_DT = (SELECT MAX(t2.Transaction_DT)
FROM Transactions t2
WHERE t2.Location_ID = t1.Location_ID)
AND Inventory_ID = 302 ORDER BY t1.Transaction_DT
Или это:
SELECT t1.*
FROM Transactions t1
WHERE t1.Transaction_ID = (SELECT TOP 1 t2.Transaction_ID
FROM Transactions t2
WHERE t2.Location_ID = t1.Location_ID
ORDER BY t2.Transaction_ID DESC)
AND Inventory_ID = 302 ORDER BY t1.Transaction_DT
Результирующий набор пуст, как это:
+----------------+--------------+----------------+-------------+----------------------+
| Transaction_ID | Inventory_ID | Transaction_DT | Location_ID | Transaction_Quantity |
+----------------+--------------+----------------+-------------+----------------------+
| | | | | |
+----------------+--------------+----------------+-------------+----------------------+
Может кто-нибудь сказать, что здесь происходит? Почему запросы возвращают ожидаемый результат только в таблице с транзакциями для определенного элемента? Единственное, о чем я могу думать, это то, что это может быть связано с тем, как была создана исходная таблица транзакций, потому что я не дублировал все ограничения / внешние ключи и т. Д.