SQL左联接和计算列未生成所需结果
我相信我在这里有点离谱,但我不确定最好的方法是什么。我有一张产品台和一张预订台。我需要根据他们在特定时间段内的预订情况,即时评估产品的可用性。每个产品可能有多个预订,但我的结果应该是产品表,其中有一个可用性的计算列。这是我到目前为止所拥有的,但左外连接不是我所需要的。我确信有更好的方法来处理我的case语句并消除连接SQL左联接和计算列未生成所需结果,sql,join,linq-to-sql,calculated-columns,Sql,Join,Linq To Sql,Calculated Columns,我相信我在这里有点离谱,但我不确定最好的方法是什么。我有一张产品台和一张预订台。我需要根据他们在特定时间段内的预订情况,即时评估产品的可用性。每个产品可能有多个预订,但我的结果应该是产品表,其中有一个可用性的计算列。这是我到目前为止所拥有的,但左外连接不是我所需要的。我确信有更好的方法来处理我的case语句并消除连接 CREATE FUNCTION [dbo].[GetAvailableReservations] ( @StartDate DateTime, @EndD
CREATE FUNCTION [dbo].[GetAvailableReservations]
(
@StartDate DateTime,
@EndDate DateTime
)
RETURNS TABLE
AS
RETURN
(
SELECT p.*,
CASE
WHEN r.Status = 'Active' AND r.StartDate >= @StartDate AND r.EndDate <= @EndDate
THEN 'Reserved'
WHEN r.Status = 'Primary' AND r.StartDate >= @StartDate AND r.EndDate <= @EndDate
THEN 'Sold'
WHEN r.Status = 'Primary' AND r.StartDate >= DATEADD(YY,-1,GETDATE()) AND r.EndDate <= GETDATE()
THEN 'Refused'
WHEN EXISTS (SELECT * FROM dbo.URL u WHERE u.URL = p.URL AND u.Date < DATEADD(YY,-2,GETDATE()))
THEN 'Needs Review'
ELSE
'Available'
END AS Availability
FROM dbo.Product AS p
LEFT JOIN dbo.Reservation AS r
ON p.Name = r.Title
)
如果您不希望每个产品的状态超过9个,那么这可能会起作用: 选择p.name, 萨姆凯斯
当r.Status='Active'和r.StartDate>=@StartDate和r.EndDate=@StartDate和r.EndDate=DATEADDYY,-1时,GETDATE和r.EndDate就可以正常工作了。但我不确定它有多最优
SELECT p.*,
CASE
WHEN 'Active' IN (SELECT r.Status FROM dbo.Reservation r WHERE r.Title = p.Name AND r.StartDate >= @StartDate AND r.EndDate <= @EndDate)
THEN 'Reserved'
WHEN 'Primary' IN (SELECT r.Status FROM dbo.Reservation r WHERE r.Title = p.Name AND r.StartDate >= @StartDate AND r.EndDate <= @EndDate)
THEN 'Sold'
WHEN 'Primary' IN (SELECT r.Status FROM dbo.Reservation r WHERE r.Title = p.Name AND r.StartDate >= DATEADD(YY,-1,GETDATE()) AND r.EndDate <= GETDATE() )
THEN 'Refused'
WHEN EXISTS (SELECT * FROM dbo.URL u WHERE u.URL = p.URL AND u.Date < DATEADD(YY,-2,GETDATE()))
THEN 'Needs Review'
ELSE
'Available'
END Availability
FROM dbo.Product AS p
问题是什么?难道您不知道如何在LINQ中将UDF调用为SQL吗?我的问题是关于函数本身以及join和case语句是否是动态计算列的最佳方法。我只是想给出一个我为什么首先采用这种方法的总体说明。我一直收到以下错误,无法对包含聚合或子查询的表达式执行聚合函数。我希望我的最终结果是产品表+可用性列。这样,我可以在代码linq to sql中调用它,并对其运行查询并将其绑定到网格。查询逻辑应检查保留表中是否存在该产品,如果存在,则首先检查保留状态是否在日期范围内处于活动状态。如果是的话,那么这种可用性就是先例。如果不是,那么它会检查预订状态,以查看它是否是日期范围的主预订。。。如果预订表中不存在该URL,请在URL表中检查该URL的日期。如果该URL的日期超过两年,则可用性需要检查。最后,如果这些都不是事实,那么该产品是可用的。
SELECT p.*,
CASE
WHEN 'Active' IN (SELECT r.Status FROM dbo.Reservation r WHERE r.Title = p.Name AND r.StartDate >= @StartDate AND r.EndDate <= @EndDate)
THEN 'Reserved'
WHEN 'Primary' IN (SELECT r.Status FROM dbo.Reservation r WHERE r.Title = p.Name AND r.StartDate >= @StartDate AND r.EndDate <= @EndDate)
THEN 'Sold'
WHEN 'Primary' IN (SELECT r.Status FROM dbo.Reservation r WHERE r.Title = p.Name AND r.StartDate >= DATEADD(YY,-1,GETDATE()) AND r.EndDate <= GETDATE() )
THEN 'Refused'
WHEN EXISTS (SELECT * FROM dbo.URL u WHERE u.URL = p.URL AND u.Date < DATEADD(YY,-2,GETDATE()))
THEN 'Needs Review'
ELSE
'Available'
END Availability
FROM dbo.Product AS p