Присоединение в SQL - PullRequest
1 голос
/ 20 марта 2019

У меня есть две таблицы в SQL Server, одна из которых содержит список спецификаций (BoM):

MainPartNo
RequiredPartNo
Quantity

, а другая - все сериализированные сборки и все сериализованные детали:

PartNo
SerialNo
Child PartNo
Child SerialNo

То, что я пытаюсь сделать, это перечислить все BoM и вывести серийный номер, если ребенок принадлежит родителю.Я справился с этим на одном уровне, но некоторые BoM вызывают вспомогательные BoM, и в результате я получаю слишком много результатов из моего запроса: если BoM содержит 5 элементов и есть один дочерний серийный номер, я получаю 5 строк, на которых отображаются всетот же родитель и потомок

Мой текущий запрос выглядит следующим образом:

SELECT
    MainPartNo,
    ParentSerialNo,
    RequiredPartNo,
    ChildSerialNo
FROM 
    BoM_TBL 
LEFT JOIN 
    Serial_TBL on MainPartNo = PartNo

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

Я ищу список BoM для каждой сериализованной сборки со значениями NULL в столбце ChildSerialNo, где сборка содержит сериализованный дочерний элемент.

EDIT

Структура данных таблиц

Серийная таблица

Serial Table

Таблица BoM

BoM Table

Желаемый выход

Desired Output

Ответы [ 3 ]

1 голос
/ 20 марта 2019

Может работать внешнее приложение ...

SELECT 
A.MainPartNo,
B.ParentSerialNo,
A.RequiredPartNo,
C.ChildSerialNo
FROM Serial_TBL A
OUTER APPLY (
    SELECT DISTINCT ParentSerialNo FROM BoM_TBL WHERE PartNoParent = A.MainPartNo
) B
LEFT JOIN BoM_TBL C on A.MainPartNo = C.PartNoParent AND B.ParentSerialNo = C.ParentSerialNo AND A.RequiredPartNo = C.PartNoChild 
1 голос
/ 20 марта 2019

Вы хотите что-то подобное

CREATE TABLE #BoM 
(
    MainPartNo VARCHAR(20),
    RequiredPartNo VARCHAR(20),
    Quantity INT
)

INSERT INTO #BoM (MainPartNo, RequiredPartNo, Quantity)
VALUES ('AssemblyA', 'ChildA', 2), ('AssemblyA', 'ChildA', 2),
       ('AssemblyA', 'ChildB', 2), ('AssemblyA', 'ChildC', 2),
       ('AssemblyA', 'PartA', 1), ('AssemblyA', 'PartB', 2),
       ('AssemblyB', 'ChildA', 2), ('AssemblyB', 'ChildD', 3),
       ('AssemblyB', 'ChildE', 1), ('AssemblyB', 'PartA', 1)

CREATE TABLE #Serial 
(
     ParentSerialNo INT,
     ChildSerialNo INT,
     PartNoChild VARCHAR(20),
     PartNoParent VARCHAR(20)
)

INSERT INTO #Serial (ParentSerialNo, ChildSerialNo, PartNoChild, PartNoParent)
VALUES (5001, 10001, 'ChildA', 'AssemblyA'),
       (5001, 10002, 'ChildA', 'AssemblyA'),
       (5001, 11001, 'ChildB', 'AssemblyA'),
       (5001, 11002, 'ChildB', 'AssemblyA'),
       (5001, 12001, 'ChildC', 'AssemblyA'),
       (5001, 12002, 'ChildC', 'AssemblyA'),
       (5002, 10003, 'ChildA', 'AssemblyB'),
       (5002, 10004, 'ChildA', 'AssemblyB'), 
       (5002, 13001, 'ChildD', 'AssemblyB'),
       (5002, 13002, 'ChildD', 'AssemblyB'),
       (5002, 13003, 'ChildD', 'AssemblyB'),
       (5002, 14001, 'ChildE', 'AssemblyB')


SELECT 
    MainPartNo, 
    ParentSerialNo,
    RequiredPartNo,
    ChildSerialNo
FROM
    #BoM B
FULL JOIN 
    #Serial S ON B.MainPartNo = S.PartNoParent
              AND B.RequiredPartNo = S.PartNoChild

Но я предполагаю, что в вашей таблице BoM есть столбец, подобный MainPortSerialNo, iIf, поэтому используйте MainPortSerialNo вместо ParentSerialNo в запросе

0 голосов
/ 20 марта 2019

Будет ли это доставить то, что вы хотите (пример таблицы результатов будет полезным)?

Select

MainPartNo,
aa.serial_tbl as ParentSerialNo,
RequiredPartNo

FROM BoM_TBL 
Outer apply (select top 1 Serial_TBL where MainPartNo = PartNo and childserialno is null) aa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...