将SQL查询组合,将第一个查询的结果作为第二个查询的参数传递(SQL Server)

3

我有点生疏SQL,需要验证一个系统中转换的一些数据。先前开发的查询在转换之前不是很准确。我已经能够追溯源数据并验证转换的正确性,但这是逐个账户进行的。我希望有一个查询来显示完整的数据集。

我已经将解决方案缩减到了两个查询,但我无法想出如何将它们组合成一个片段以显示完整的数据集,其中第一个查询的一个值需要作为第二个查询的一个元素。

查询1:

select distinct 
    CreatedDate, AccountNum 
From 
    Table1 A
Join 
    Table2 B on A.Column1 = B.Column1 and a.Column2 = b.Column2
Join 
    Table3 C on A.Column3 = C.Column3 and A.Column4 = C.Column4
where 
    Condition A and Condition B

查询2

Select distinct 
    AccountNum, Responsible
From 
    Table3 D
Join 
    Table4 E on D.Column1 = E.Column2
where 
    StartDate <= 'DateValue' and EndDate > 'DateValue'

我想在查询1中使用CreatedDate值作为查询2的DateValue,但我找不到解决方案来获得所需的结果。
如果我给每个查询添加限定符,例如账户号码,那么查询1将只返回一个结果。然后,我将该CreatedDate值放入查询2中,就能获得我想要的结果。如果我只在第二个查询中有账户号码,则会得到两个结果,一个区间为A到B的负责值为X,另一个区间为C到D的负责值为Y,其中CreateDate值落在这个时间段。我尝试过的任何组合这些查询的方法都会得到负责值为X(或没有结果),而我想要的是Y值。
我一直无法成功地将这两个查询集成在一起,以便将CreatedDate值传递为参数来确定负责值。
一个可行的解决方案是创建一个用于存储第一个查询结果的中间表,并将该表连接到第二个查询中。但我无法访问数据库中的创建/插入/更新表/记录的权限,因此无法使用此方法。
3个回答

0

我想你正在寻找这个

SELECT DISTINCT accountnum, 
                responsible 
FROM   table1 A 
       JOIN table2 B 
         ON A.column1 = B.column1 
            AND a.column2 = b.column2 
       JOIN table3 C 
         ON A.column3 = C.column3 
            AND A.column4 = C.column4 
       JOIN table4 D 
         ON D.column1 = C.column2 
            AND startdate <= createddate 
            AND enddate > createddate 
where  Condition A and Condition B

注意:您可能需要为columns添加适当的alias名称。


0

另一种解决方案是将第一个查询转换为表值 UDF:

Create function GetCreateDateAndAcctId([Parameters for 2 conditions here])
Returns table As
Return
   select distinct CreatedDate, AccountNum 
   From Table1 a
      Join Table2 b 
          on b.Column1 = a.Column1 
             and b.Column2 = a.Column2
      Join Table3 c 
          on c.Column3 = a.Column3 
             and c.Column4 = a.Column4
   where condition1   --  here put predicate    
       and condition2 -- using input parameters

接下来,要使用它,只需将其作为表格包含在第二个查询中,如下所示:

Select distinct AccountNum, Responsible
From Table3 d
    Join Table4 e
       on e.Column2 = d.Column1
    outer apply dbo.GetCreateDateAndAcctId(Parameters) cd
where StartDate <= cd.CreatedDate and EndDate > cd.CreatedDate 

如果您这样做,第一个查询的逻辑将保留在单独的数据库对象中以实现可重用性(您可以在任何其他进程中使用它而无需复制它)。并且更易于维护(只有一个地方需要修复错误和增强等)。此外,由于它是一个表值 UDF,SQL Server 查询处理器实际上会将其与第二个查询的 SQL 组合成一个可重用的编译执行计划。

0
Select distinct AccountNum, Responsible
  From Table3 D
  Join Table4 E on D.Column1 = E.Column2
  Join (
        select distinct CreatedDate, AccountNum 
          From Table1 A
          Join Table2 B on A.Column1 = B.Column1 and a.Column2 = b.Column2
          Join Table3 C on A.Column3 = C.Column3 and A.Column4 = C.Column4
         where Condition A and Condition B
       ) X
    on D.AccountNum=X.AccountNum
   and D.StartDate <= X.CreatedDate and EndDate > X.CreatedDate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接