目前我的代码是这样的。
select *
from tblReq
where ReqID in (select ReqID from tblLog where LogDate >= '2015/04/01' and LogDate < '2015/05/31')
只是想知道数据库实际上是如何找到此查询的结果的?每次在子查询中运行时它是否重新运行?是否有任何脚本我可以将结果列表存储在某个变量中并能够使用它? (下面的代码)
select @logs = tblLog.ReqID from tblLog where tblLog.LogDate >= '2015/04/01' and tblLog.LogDate < '2015/05/31'
select * from tblReq where ReqID in (@logs)
答案 0 :(得分:3)
是的,您可以将结果存储在变量中,并在以后重复使用几次。在您的情况下,它将是table variable
,因为您可以有多个项目。然后,简单join
到初始查询:
DECLARE @Logs TABLE
(
[LogID] INT
);
INSERT INTO @Logs ([LogID])
Select tblLog.ReqID
from tblLog
where tblLog.LogDate >= '2015/04/01'
and tblLog.LogDate < '2015/05/31'
select *
from tblReq A
INNER JOIN @Logs L
ON A.ReqID = L.LogID
此外,这可能会损害您的查询性能,因为表变量与查询优化器的black box
不同。如果要存储大量行,请使用temporary
表,以便使用并行执行计划。
答案 1 :(得分:1)
如果您想稍后参考您的查询,可以创建view
CREATE VIEW V1 AS
SELECT tblLog.ReqID
FROM tblLog
WHERE tblLog.LogDate >= '2015/04/01'
AND tblLog.LogDate < '2015/05/31'
根据以下评论,您也可以使用table valued function
CREATE FUNCTION functionName(@start DATE, @end DATE)
RETURNS @result TABLE
(
ReqID INT NOT NULL
)
AS
BEGIN
INSERT @result
SELECT tblLog.ReqID
FROM tblLog
WHERE tblLog.LogDate >= @start
AND tblLog.LogDate < @end
RETURN;
END;
答案 2 :(得分:1)
对于你的情况..最好的解决方案是使用连接
最好的(即使在复杂的情况下也能工作)它包含一个查询表(tblLog)
select * from tblReq join (select logid from tbllog where
tblLog.LogDate >= '2015/04/01' and tblLog.LogDate < '2015/05/31')tblLog
on tblReq.ReqID=tblLog.ReqID
或简单
select * from tblReq join tblLog on tblReq.ReqID=tblLog.ReqID where
tblLog.LogDate >= '2015/04/01' and tblLog.LogDate < '2015/05/31'
或者更简单:你也可以使用子查询(子查询更简单,但如果得到的结果太多,则表示性能会降低)
select * from tblReq where ReqID in (select tblLog.ReqID from tblLog where
tblLog.LogDate >= '2015/04/01' and
tblLog.LogDate < '2015/05/31')
如果您必须存储,因为您在同一过程中多次使用
craete TABLE #logs
(
[LogID] INT
);
insert into #logs select tblLog.ReqID from tblLog where
tblLog.LogDate >= '2015/04/01' and
tblLog.LogDate < '2015/05/31'
select * from tblReq where ReqID in (select logid from #logs) // or use join
重要强>
variable
存储单个值。临时表存储complete table
。对于迭代(通过临时表或其他行),有cursors
。但是请尝试使用