我有点不熟悉SQL,我正试图验证一些已在系统中转换的数据。我在转换之前最初开发的一些查询没有证明工作。我已经能够追溯源数据并验证转换是正确的,但这是在逐个帐户的基础上进行的。我想有一个查询来显示完整的数据集。
我已经能够工作到2个查询的解决方案,但我无法弄清楚如何将它们组合成一块来显示完整的数据集,其中一个值来自第一个查询需要是第二个查询中的元素。
查询1select 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组合成一个可重用的编译执行计划。