Как использовать результат первого запроса во втором запросе, где условие? - PullRequest
1 голос
/ 04 апреля 2019

Я должен выбрать две таблицы данных, одна из которых PackageData, а другая PackageDataDetails. Здесь PackageData является родительской таблицей, а PackageDataDetails является дочерней таблицей.

См. Ниже код:

SELECT 
    PD.Id, PD.MemberId, PD.Merchant, PD.Weight, PD.Remarks
FROM 
    [dbo].[PackageData] PD
INNER JOIN 
    Account A ON A.MemberId = PD.MemberId
INNER JOIN 
    Users U ON U.Id = A.UserId AND (@UserId IS NULL OR U.Id = @UserId)
WHERE 
    (@Status IS NULL OR @Status = '' OR  PD.SystemStatus = @Status)
    AND (@Id IS NULL OR PD.Id = @Id)
ORDER BY 
    MD.Id
    OFFSET @PageSize * (@PageNo+1 - 1) ROWS  
    FETCH NEXT @PageSize ROWS ONLY 
OPTION (RECOMPILE);

SELECT 
    PDD.Id, PDD.PackageDataId, PDD.Description, PDD.Quantity, PDD.Status
FROM 
    [dbo].[PackageDataDetails] PDD
INNER JOIN 
    [dbo].[PackageData] PD ON PD.Id = PDD.PackageDataId
WHERE 
    PDD.PackageDataId IN ({PD.Id of Above Select query})

Этот блок кода записан в хранимой процедуре. Здесь я не хотел переписывать первый запрос, где условие второго запроса.

Я должен использовать эту хранимую процедуру в одном ответе API, чтобы выполнять действия только в одном вызове БД. Пожалуйста, поделитесь своей идеей, чтобы решить эту проблему.

Ответы [ 4 ]

1 голос
/ 04 апреля 2019

Вы можете вставить данные первого запроса в табличную переменную, а затем извлечь идентификатор из табличной переменной во втором запросе. Что-то вроде ниже.

Код:

 Declare @tblData TABLE
    ( 
        Id          Int,
        MemberId                    Int,
        Merchant    NVARCHAR(Max),
        Weight  NVARCHAR(Max),
        Remarks               Nvarchar(Max)

    );

   Insert Into @tblData
(
    Id,
    MemberId,
    Merchant,
    Weight,
    Remarks
)

SELECT PD.Id ,PD.MemberId, PD.Merchant,PD.Weight,PD.Remarks
FROM [dbo].[PackageData] PD
INNER JOIN Account A ON A.MemberId = PD.MemberId
INNER JOIN Users U ON U.Id = A.UserId AND (@UserId IS NULL OR U.Id = @UserId)
WHERE (@Status IS NULL OR @Status = '' OR  PD.SystemStatus = @Status)
AND (@Id IS NULL OR PD.Id = @Id)
ORDER BY MD.Id
OFFSET @PageSize * (@PageNo+1 - 1) ROWS  FETCH NEXT @PageSize ROWS ONLY OPTION (RECOMPILE);

SELECT PDD.Id, PDD.PackageDataId, PDD.Description, PDD.Quantity, PDD.Status
FROM [dbo].[PackageDataDetails] PDD
INNER JOIN [dbo].[PackageData] PD ON PD.Id = PDD.PackageDataId
WHERE PDD.PackageDataId IN (select Id from @tblData )
0 голосов
/ 04 апреля 2019

Использование CTE (общее табличное выражение):

т.е:

    ;with CTE1 as (
 select 1 as Col1,
 2 as Col2,
 3 as Col3
), CTE2 as (
select 1 as Col1,
        5 as Col2,
        6 as Col3
)select * from CTE1 where CTE1.Col1 IN (select Col1 from CTE2)
0 голосов
/ 04 апреля 2019

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

;WITH PackageDataFiltered AS
(
    SELECT PD.Id ,PD.MemberId, PD.Merchant,PD.Weight,PD.Remarks
    FROM [dbo].[PackageData] PD
    INNER JOIN Account A ON A.MemberId = PD.MemberId
    INNER JOIN Users U ON U.Id = A.UserId AND (@UserId IS NULL OR U.Id = @UserId)
    WHERE (@Status IS NULL OR @Status = '' OR  PD.SystemStatus = @Status)
    AND (@Id IS NULL OR PD.Id = @Id)
    ORDER BY MD.Id
    OFFSET @PageSize * (@PageNo+1 - 1) ROWS  FETCH NEXT @PageSize ROWS ONLY 
)
SELECT PDD.Id, PDD.PackageDataId, PDD.Description, PDD.Quantity, PDD.Status
-- You can refer to fields from the CTE here too
-- like select the PDF.Merchant or PDF.Remarks
FROM [dbo].[PackageDataDetails] PDD
INNER JOIN [dbo].[PackageData] PD ON PD.Id = PDD.PackageDataId
INNER JOIN PackageDataFiltered PDF ON PDF.Id = PDD.PackageDataId
0 голосов
/ 04 апреля 2019

Пожалуйста, попробуйте ниже запроса.

Первый запрос

SELECT 
    PD.Id ,PD.MemberId, PD.Merchant,PD.Weight,PD.Remarks
    INTO #temp 
    FROM [dbo].[PackageData] PD
    INNER JOIN Account A ON A.MemberId = PD.MemberId
    INNER JOIN Users U ON U.Id = A.UserId AND (@UserId IS NULL OR U.Id = @UserId)
    WHERE (@Status IS NULL OR @Status = '' OR  PD.SystemStatus = @Status)
    AND (@Id IS NULL OR PD.Id = @Id)
    ORDER BY MD.Id
    OFFSET @PageSize * (@PageNo+1 - 1) ROWS  FETCH NEXT @PageSize ROWS ONLY OPTION (RECOMPILE);

получить вывод первым запросом

 SELECT * FROM #temp 

Второй запрос с первым результатом запроса.

SELECT 
     PDD.Id, PDD.PackageDataId, PDD.Description, PDD.Quantity, PDD.Status
FROM [dbo].[PackageDataDetails] PDD
    INNER JOIN [dbo].[PackageData] PD ON PD.Id = PDD.PackageDataId
    WHERE PDD.PackageDataId IN (SELECT PD.Id FROM #temp)

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