Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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
Join SQL连接三个表一个表与其他两个表_Join_Subquery_Sql Server 2014 Express - Fatal编程技术网

Join SQL连接三个表一个表与其他两个表

Join SQL连接三个表一个表与其他两个表,join,subquery,sql-server-2014-express,Join,Subquery,Sql Server 2014 Express,我做了下面的示例代码,作为我面临的一个示例 假设a有以下表格: 股票:我每天都有我当前的股票图片。 ProductType:如果我库存的产品是水果,我可以从中获得信息。 水果价格:我有一个历史价格,每种水果的价格。 OtherSprites:我有其他种类产品的历史价格 我需要一个给定的股票日期加载所有的历史价格,无论是水果或其他 所以首先我需要在STOCK和ProductType之间进行连接,以从ProductType返回列IsFruit bit列。我只知道你会为一个送礼的股票日加入这个行列 然

我做了下面的示例代码,作为我面临的一个示例

假设a有以下表格: 股票:我每天都有我当前的股票图片。 ProductType:如果我库存的产品是水果,我可以从中获得信息。 水果价格:我有一个历史价格,每种水果的价格。 OtherSprites:我有其他种类产品的历史价格

我需要一个给定的股票日期加载所有的历史价格,无论是水果或其他

所以首先我需要在STOCK和ProductType之间进行连接,以从ProductType返回列IsFruit bit列。我只知道你会为一个送礼的股票日加入这个行列

然后,我需要建立一个历史价格表的产品,我的上述加入回报。如果IsFruit=1,则从FruitePrice表M获取价格;如果IsFruit=0,则从OthersPrice表获取价格

我所面临的问题是,假设我正在寻找10Apr15的库存产品,并在库存和ProductType I return之间进行首次连接:

StockDate   Product IsFrute
10Apr15     Banana   1
10Apr15     Milk     0
然后我做第二个连接,返回从2015年1月10日到2015年4月10日各个表中的香蕉和牛奶价格

我希望通过以下方式了解香蕉和牛奶的历史价格:

我可能没有遗漏产品历史价格的日期,此案例应返回NULL。上面的例子中,香蕉从2015年1月11日开始有价格,然后在2015年1月10日返回NULL

最后,我遇到的问题是,在上面的表中,每种组合的日期都有一行,比如nxnxn

我正在做的示例:

更新2: 实查询


从2015年4月10日起,使用CTE获取产品是否可行?CTE将创建一个较小的产品子集以加入您的表格。既然你有一张水果价格表和一张其他价格表,你需要国旗是水果吗?以下是TSQL代码:

WITH cte_products( ProdName)
AS
(SELECT Prodname FROM Stock WHERE PriceDate = '10Apr15')
SELECT STK.PriceDate, STK.ProdName, Coalesce(FP.Price,OP.Price)
FROM cte_products cte   
JOIN Stock STK ON cte.Prodname = STK.Prodname
LEFT OUTER JOIN FruitPrice FP ON cte.Prodname = FP.Name
LEFT OUTER JOIN Othersprice OP ON cte.Prodname = OP.Name
WHERE STK.PriceDate >= '10Jan15' and STK.PriceDate <= '10Apr15'

你能具体说明你的问题吗?预期结果是什么?实际结果是什么?你能在桌子上给他们看吗?IMO一个很好的问题将包括一些特定的价格,比如这个价格不应该是NULL,它应该是因为原因Y。还考虑添加一个关于www. SqLFIDDL.COMM的例子,为StordDead的每一个组合接收一行,fruitdate和othersdate。现在它包含在末尾。您在哪里检查ProcutType表中的IsFruit=1?我假设表FruitPrice仅包含水果的产品名称和价格,而表Otherprice仅包含其他产品(而非水果)的产品名称和价格。这是一个正确的假设吗?如果是这样的话,那么就没有必要使用isfruit标志……因为您已经在这两个表中获得了所需的所有信息。我的坏消息是,在real wen中,它的水果我使用Prodname进行连接,当它的其他水果我将使用库存中的其他列时,让我们说Prodname2。这就是为什么我需要首先加入TableProductType来检查它是水果还是其他。我在我的real querynote中包含了一个更新2,我需要验证它的水果是否是一个产品,可以有一个与水果Sprice tabel匹配的Prodname,也可以有一个与OthersPrice表匹配的Productname2,我不想两次返回它知道应该使用什么的标准是IsFruit=1我转到Prodname并加入如果IsFruit=0,我将使用Prodname2与OthersPrice连接
Select GP.PriceDate, GP.ProdName, case(GP.IsFrute = 1, FP.Price, else OP.Price)
(
    Select STK.PriceDate, STK.ProdName, PT.IsFrute
    from Stock as STK
    Join ProductType as PT on PT.ProdName = STK.ProdName
) as GP
join FruitPrice as FP on FP.Name = GP.ProdName
join OthersPrice as OT on OP.Name = GP.Name
Where GP.PriceDate = '10Apr15'
and FP.Date >= '10Jan15' and FP.Date <= '10Apr15'
and OT.Date >= '10Jan15' and OT.Date <= '10Apr15'
Refdate     Date        Date    Price
2015-05-13  2015-05-04  NULL    2650.000000000000
2015-05-13  2015-05-05  NULL    2650.000000000000
2015-05-13  2015-05-06  NULL    2650.000000000000
2015-05-13  2015-05-07  NULL    2460.000000000000
2015-05-13  2015-05-08  NULL    2490.000000000000
2015-05-13  2015-05-11  NULL    2660.000000000000
2015-05-13  2015-05-12  NULL    2660.000000000000
2015-05-13  2015-05-13  NULL    2770.000000000000
2015-05-13  2015-05-14  NULL    2610.000000000000
2015-05-13  2014-12-31  2015-05-06  1490.000000000000
2015-05-13  2014-12-31  2015-05-07  1490.000000000000
2015-05-13  2014-12-31  2015-05-08  1490.000000000000
2015-05-13  2014-12-31  2015-05-11  1490.000000000000
2015-05-13  2014-12-31  2015-05-12  1490.000000000000
2015-05-13  2014-12-31  2015-05-13  1490.000000000000
2015-05-13  2014-12-31  2015-05-14  1490.000000000000
2015-05-13  2014-12-31  2015-05-05  1490.000000000000
2015-05-13  2015-01-02  2015-05-06  1490.000000000000
2015-05-13  2015-01-02  2015-05-07  1490.000000000000
2015-05-13  2015-01-02  2015-05-08  1490.000000000000
2015-05-13  2015-01-02  2015-05-11  1490.000000000000
2015-05-13  2015-01-02  2015-05-12  1490.000000000000
With cte_RiskFactors(RiskFactor)
AS
(Select RiskFactor, ProdId, from Exposure where Refdate = '20150513')
Select Expo.refdate, expo.riskfactor, expo.ProdId, px.price
from cte_RiskFactors as cte
join Exposure as expo on cte.RiskFactor = expo.RiskFactor
join Prices as px on px.Id_Product = cte.ProdId
where px.[Date] >= '20150501' and px.[Date] <= '20150513'
UNION
Select Expo.refdate, expo.riskfactor, iv.Value
from cte_RiskFactors as cte
join Exposure as expo on cte.RiskFactor = expo.RiskFactor
join IndexesValue as iv on iv.Id_RiskFactor = cte.IdRF
where iv.[Date] >= '20150501' and iv.[Date] <= '20150513'
Msg 207, Level 16, State 1, Line 62
Invalid column name 'IdRF'.
Msg 207, Level 16, State 1, Line 59
Invalid column name 'price'.
WITH cte_products( ProdName)
AS
(SELECT Prodname FROM Stock WHERE PriceDate = '10Apr15')
SELECT STK.PriceDate, STK.ProdName, Coalesce(FP.Price,OP.Price)
FROM cte_products cte   
JOIN Stock STK ON cte.Prodname = STK.Prodname
LEFT OUTER JOIN FruitPrice FP ON cte.Prodname = FP.Name
LEFT OUTER JOIN Othersprice OP ON cte.Prodname = OP.Name
WHERE STK.PriceDate >= '10Jan15' and STK.PriceDate <= '10Apr15'