Дизайн приложения форсирует структуру запроса.Запрос возвращает дубликаты результатов из Join.Как исправить набор результатов с ограниченными параметрами? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь исправить набор результатов, возвращаемый определенным запросом.В запросе используются следующие таблицы:

Inventory:
+--------------+---------------+
| Inventory_ID | Inventory_MFN |
+--------------+---------------+
|          302 |       0170315 |
+--------------+---------------+

InventoryItem:
+---------+-----------------+--------------+
| Item_ID | Item_Serial_Num | Inventory_ID |
+---------+-----------------+--------------+
|    1156 | 10095-001       |          302 |
|    1157 | 10095-002       |          302 |
|   25433 | 10095-003       |          302 |
|   30663 | 10095-004       |          302 |
+---------+-----------------+--------------+

Он также использует представление, которое возвращает результат, подобный следующему:

InventoryQuantity(view):
+--------------+-------------+-------------------+
| Inventory_ID | Location_ID | Location_Quantity |
+--------------+-------------+-------------------+
|          302 |           1 |                 2 |
|          302 |          31 |                 1 |
|          302 |          11 |                 1 |
+--------------+-------------+-------------------+

Это запрос:

SELECT    i.Inventory_ID, ii.Item_Serial_Num
FROM      Inventory i
FULL JOIN InventoryItem ii ON i.Inventory_ID = ii.Inventory_ID
FULL JOIN InventoryQuantity iq ON i.Inventory_ID = iq.Inventory_ID
WHERE     i.Inventory_MFN = '0170315'

Он возвращает набор результатов следующим образом:

+--------------+-----------------+
| Inventory_ID | Item_Serial_Num |
+--------------+-----------------+
|          302 | 10095-001       |
|          302 | 10095-001       |
|          302 | 10095-001       |
|          302 | 10095-002       |
|          302 | 10095-002       |
|          302 | 10095-002       |
|          302 | 10095-003       |
|          302 | 10095-003       |
|          302 | 10095-003       |
|          302 | 10095-004       |
|          302 | 10095-004       |
|          302 | 10095-004       |
+--------------+-----------------+

Но на самом деле мы хотим, чтобы набор результатов выглядел так:

+--------------+-----------------+
| Inventory_ID | Item_Serial_Num |
+--------------+-----------------+
|          302 | 10095-001       |
|          302 | 10095-002       |
|          302 | 10095-003       |
|          302 | 10095-004       |
+--------------+-----------------+

Из-за дизайна этого конкретного приложения, измененияЯ могу сделать так, чтобы структура запроса была очень ограниченной.Из того, что я могу сказать, это мои варианты:

  • Я могу изменить таблицы и представления, на которые есть ссылки в запросе.
  • Я могу изменить представление или создать новое представление.
  • Я могу добавить несколько дополнительных столбцов в таблицы / представление для присоединения.
  • Я могу разместить подзапрос внутри одного (или обоих) объединений.

Что вы, ребята, думаете?Можно ли это сделать?

1 Ответ

2 голосов
/ 16 апреля 2019

Запрос, который вы действительно хотите:

SELECT i.Inventory_ID, ii.Item_Serial_Num
FROM Inventory i INNER JOIN
     InventoryItem ii
     ON i.Inventory_ID = ii.Inventory_ID
WHERE i.Inventory_MFN = '0170315';

Или, может быть, LEFT JOIN.

Если вам нужно следовать этой структуре, то я думаю, что это будет делать то, что вы хотите:

SELECT i.Inventory_ID, ii.Item_Serial_Num
FROM Inventory i FULL JOIN
     InventoryItem ii
     ON i.Inventory_ID = ii.Inventory_ID FULL JOIN
     (SELECT TOP (0) iq.*
      FROM InventoryQuantity iq
     ) iq
     ON i.Inventory_ID = iq.Inventory_ID
WHERE i.Inventory_MFN = '0170315';

Это в основном сводит на нет второй FULL JOIN.

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