Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL左联接和计算列未生成所需结果_Sql_Join_Linq To Sql_Calculated Columns - Fatal编程技术网

SQL左联接和计算列未生成所需结果

SQL左联接和计算列未生成所需结果,sql,join,linq-to-sql,calculated-columns,Sql,Join,Linq To Sql,Calculated Columns,我相信我在这里有点离谱,但我不确定最好的方法是什么。我有一张产品台和一张预订台。我需要根据他们在特定时间段内的预订情况,即时评估产品的可用性。每个产品可能有多个预订,但我的结果应该是产品表,其中有一个可用性的计算列。这是我到目前为止所拥有的,但左外连接不是我所需要的。我确信有更好的方法来处理我的case语句并消除连接 CREATE FUNCTION [dbo].[GetAvailableReservations] ( @StartDate DateTime, @EndD

我相信我在这里有点离谱,但我不确定最好的方法是什么。我有一张产品台和一张预订台。我需要根据他们在特定时间段内的预订情况,即时评估产品的可用性。每个产品可能有多个预订,但我的结果应该是产品表,其中有一个可用性的计算列。这是我到目前为止所拥有的,但左外连接不是我所需要的。我确信有更好的方法来处理我的case语句并消除连接

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