SQL: возвращаемое значение на основе отношений - PullRequest
0 голосов
/ 09 марта 2020

Рассмотрим три таблицы в SQL серверной базе данных, STOCK, BINS и VENDORS:

:: STOCK                    :: BINS               :: VENDORS
+------+-----+-------+      +-----+--------+      +----+---------+
| SKU  | BIN | COUNT |      | BIN | VENDOR |      | ID |  NAME   |
+------+-----+-------+      +-----+--------+      +----+---------+
| 1000 | A01 |     3 |      | A01 |      1 |      |  1 | Apples  |
| 2000 | A02 |     4 |      | A02 |      1 |      |  2 | Oranges |
| 1000 | B01 |     6 |      | B01 |      2 |      +----+---------+
+------+-----+-------+      +-----+--------+

Как мне вернуть набор результатов, включающий все столбцы из * 1007 Таблица * STOCK вместе с именем поставщика из таблицы VENDORS , с условием, что я ищу конкретный c номер. Имя поставщика должно быть определено на основе отношения ID между таблицей BINS и VENDORS.

Требуемый вывод:

+------+-----+-------+---------+
| SKU  | BIN | COUNT | VENDOR  |
+------+-----+-------+---------+
| 1000 | A01 |     3 | Apples  |
| 1000 | B01 |     6 | Oranges |
+------+-----+-------+---------+

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

SELECT [stock].*,
       (
        SELECT [vendors].[name]
        FROM [vendors], [bins]
        WHERE [vendors].[id] = [bins].[vendor]
          AND [bins].[bin] = [stock].[bin]
       ) AS [vendor]
FROM [stock]
WHERE [stock].[sku] = '1000'

Я получаю этот результат (проблема в NULL):

+------+-----+-------+--------+
| SKU  | BIN | COUNT | VENDOR |
+------+-----+-------+--------+
| 1000 | A01 |     3 | Apples |
| 1000 | B01 |     6 | NULL   |
+------+-----+-------+--------+

Как мне сформировать свой запрос, чтобы получить желаемый результат отмечено выше, наиболее производительным образом?

1 Ответ

2 голосов
/ 09 марта 2020

Простые объединения должны делать то, что вы хотите:

select
    s.*,
    v.name
from stock s
inner join bins b on b.bin = s.bin
inner join vendors v on v.id = b.vendor
where s.sku = 1000

Если есть вероятность неизвестных корзин или поставщиков, вы можете использовать left join s вместо inner join s.

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