将SQL查询1的结果作为第二个(SQL Server)的参数传递



我有点不熟悉SQL,我正试图验证一些已在系统中转换的数据。我在转换之前最初开发的一些查询没有证明工作。我已经能够追溯源数据并验证转换是正确的,但这是在逐个帐户的基础上进行的。我想有一个查询来显示完整的数据集。

我已经能够工作到2个查询的解决方案,但我无法弄清楚如何将它们组合成一块来显示完整的数据集,其中一个值来自第一个查询需要是第二个查询中的元素。

查询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的1个结果。然后我将CreatedDate放入查询2中,我得到了我想要的结果。如果我在第二次查询中只有账号,我得到两个结果,一个是从时间段A到B,负责值为X,第二个是从时间段C到D,负责值为Y,这是CreateDate值介于两者之间的地方。当我想要Y值时,我试图将这些查询结合起来的所有内容都以负责任的X值(或没有结果)结束。

我无法成功地集成这两个查询,因此我可以将CreatedDate值作为参数传递,以确定Responsible值。

一个可行的解决方案是为第一个查询的结果创建一个中间表,然后将该表连接到第二个查询。但是,我没有权限在数据库上创建/插入/更新表/记录,所以我不能使用这种方法。

我想你在找这个

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名称
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

另一个解决方案是将第一个查询写入表值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 

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

最新更新