Я пытаюсь понять, как объединить запросы, когда один из них возвращает более одной записи.Консолидация запросов
Это отчет о выставлении счета, в котором я хочу вывести серийные номера выставленных счетов. Я сокращу сценарий как можно больше, чтобы уточнить. Вот мой сценарий перед добавлением серий:
SELECT ARM.fcustno AS [Cust No]
, ARM.fbcompany AS [Cust Name]
, ARM.fcinvoice AS [Invoice No]
, ARM.fdgldate AS [Post Date]
, ARI.fitem AS [Item No]
, ARI.fprodcl AS [Prod Class]
, ARI.fshipkey AS [Qty Invoiced]
, ARI.fpartno AS [Part No]
, ARI.frev AS [Part Rev]
, ARI.FTOTPRICE AS [Net Invoiced]
, ARM.fsono AS [Sales No]
, SOM.fcusrchr2
FROM dbo.armast ARM
INNER JOIN dbo.aritem ARI ON ARM.FCINVOICE = ARI.FCINVOICE
INNER JOIN slcdpm SLC ON SLC.fcustno = ARM.fcustno
LEFT OUTER JOIN slcdpm_ext SLCE ON SLC.identity_column = SLCE.fkey_id
LEFT OUTER JOIN somast SOM ON SOM.fsono = ARM.fsono
Это возвращает счета-фактуры, их цены и т. Д. Когда я втягиваю в следующее:
SELECT ARM.fcustno AS [Cust No]
, ARM.fbcompany AS [Cust Name]
, ARM.fcinvoice AS [Invoice No]
, ARM.fdgldate AS [Post Date]
, ARI.fitem AS [Item No]
, ARI.fprodcl AS [Prod Class]
, ARI.fshipkey AS [Qty Invoiced]
, ARI.fpartno AS [Part No]
, ARI.frev AS [Part Rev]
, ARI.FTOTPRICE AS [Net Invoiced]
, ARM.fsono AS [Sales No]
, SOM.fcusrchr2
, LOTC.fcuseinlot
FROM dbo.armast ARM
INNER JOIN dbo.aritem ARI ON ARM.FCINVOICE = ARI.FCINVOICE
INNER JOIN slcdpm SLC ON SLC.fcustno = ARM.fcustno
LEFT OUTER JOIN slcdpm_ext SLCE ON SLC.identity_column = SLCE.fkey_id
LEFT OUTER JOIN somast SOM ON SOM.fsono = ARM.fsono
--** New stuff below: ******
LEFT OUTER JOIN ShItem SHI ON SHI.fShipNo + SHI.fItemNo = ARI.fShipKey
LEFT OUTER JOIN ShSrce ON ShSrce.fcShipNo = SHI.fShipNo
AND ShSrce.fcItemNo = SHI.fItemNo
LEFT OUTER JOIN QaLotC LOTC ON LOTC.fcUseInDoc = ShSrce.fcShipNo + ShSrce.fcItemNo + ShSrce.fcSrcItmNo
Проблема в том, что на счет-фактуру может быть несколько записей SHSRCE. Каков наилучший способ справиться с этим? Возможно, используйте подзапрос, чтобы объединить поле LOTC.fcuseinlot, чтобы вернуть одно соответствующее значение на запись.
Чтобы уточнить, дополнительный запрос возвращает более одной записи на каждую позицию, поскольку несколько частей серийного номера могут быть выставлены на счет одной позиции. В идеале я бы хотел, чтобы они были объединены как (NCC1701, R2D2, C3PO) и т. Д. Вот почему я подумал об использовании подзапроса для их конкатенации.
Личное мнение: не будучи свободно с контекстом (ваша компания/проект), этот код трудно читать.Вы можете выиграть, изменив имена объектов на «MyTable» и «Col1, Col2» и удалив те части запроса (дополнительные столбцы, псевдонимы столбцов, дополнительные объединения), которые не являются основополагающими для вашей проблемы. –
Я также предлагаю макет, как вы хотите получить результирующие данные - хотите ли вы повторять данные? –
плюс вы не вернули никаких дополнительных полей в свой второй запрос, я полагаю, вы хотели? –