2014-10-02 100 views
0

在过去的几天中,此查询一直让我忙碌。我试图用不同的想法重写它,但我仍然有同样的问题。为了简化问题,我将查询的一部分放入视图中,该视图返回了23条记录。使用左连接我想添加来自表tblDatPositionsCalc的字段到这23条记录。正如你所看到的,我对tblDatPositionsCalc有一个额外的条件,以便只考虑最近的记录。有了这个条件,它会返回21条记录。连接应该在colAccount和colId的两个字段上。SQL Server LEFT JOIN

我只是希望查询从视图中返回23条记录,并尽可能从tblDatPositionsCalc获取信息。实际上,在tblDatPositionsCalc中没有相应的id和account的情况下,视图中只有2条记录,这意味着在23条记录中,只有2条记录会在来自表tblDatPositionsCalc的字段中缺少值。

我的查询的问题是它只返回来自tblDatPositionsCalc的21条记录。我不明白为什么。我试图在加入条件之后立即移动条件,但这并没有帮助。

SELECT TOP (100) PERCENT 
     dbo.vwCurrPos.Account, 
     dbo.vwCurrPos.Id, 
     dbo.vwCurrPos.TickerBB, 
     dbo.vwCurrPos.colEquityCode, 
     dbo.vwCurrPos.colType, 
     dbo.vwCurrPos.colCcy, 
     dbo.vwCurrPos.colRegion, 
     dbo.vwCurrPos.colExchange, 
     dbo.vwCurrPos.[Instr Type], 
     dbo.vwCurrPos.colMinLastDay, 
     dbo.vwCurrPos.colTimeShift, 
     dbo.vwCurrPos.Strike, 
     dbo.vwCurrPos.colMultiplier, 
     dbo.vwCurrPos.colBetaVol, 
     dbo.vwCurrPos.colBetaEq, 
     dbo.vwCurrPos.colBetaFloor, 
     dbo.vwCurrPos.colBetaCurv, 
     dbo.vwCurrPos.colUndlVol, 
     dbo.vwCurrPos.colUndlEq, 
     dbo.vwCurrPos.colUndlFut, 
     tblDatPositionsCalc_1.colLots, 
     dbo.vwCurrPos.[Open Positions], 
     dbo.vwCurrPos.colListMatShift, 
     dbo.vwCurrPos.colStartTime, 
     tblDatPositionsCalc_1.colPrice, 
     tblDatPositionsCalc_1.colMktPrice, 
     dbo.vwCurrPos.colProduct, 
     dbo.vwCurrPos.colCalendar, 
     CAST(dbo.vwCurrPos.colExpiry AS DATETIME) AS colExpiry, 
     dbo.vwCurrPos.colEndTime, 
     CAST(tblDatPositionsCalc_1.colDate AS datetime) AS colDate, 
     dbo.vwCurrPos.colFund, 
     dbo.vwCurrPos.colExchangeTT, 
     dbo.vwCurrPos.colUserTag 
FROM dbo.vwCurrPos 
LEFT OUTER JOIN dbo.tblDatPositionsCalc AS tblDatPositionsCalc_1 
    ON tblDatPositionsCalc_1.colId = dbo.vwCurrPos.Id 
    AND tblDatPositionsCalc_1.colAccount = dbo.vwCurrPos.Account 
WHERE (tblDatPositionsCalc_1.colDate = 
    (SELECT MAX(colDate) AS Expr1 FROM dbo.tblDatPositionsCalc)) 
ORDER BY 
    dbo.vwCurrPos.Account, 
    dbo.vwCurrPos.Id, 
    dbo.vwCurrPos.colEquityCode, 
    dbo.vwCurrPos.colRegion 

任何想法可能导致问题的原因是什么?

+1

嗯,首先你说'我有一个额外的条件在tblDatPositionsCalc为了只考虑最近的记录,然后你说'它只返回21条记录'是不是你的where-clause过滤出你想要的?我理解正确吗?然后将where条件移动到您的'LEFT OUTER JOIN'的附加'AND'中可以消除您的问题。 – DrCopyPaste 2014-10-02 10:02:44

回答

0

(选项1)DrCopyPaste是正确的让你从第会是什么样子:

... 
FROM dbo.vwCurrPos 
LEFT OUTER JOIN dbo.tblDatPositionsCalc AS tblDatPositionsCalc_1 
    ON tblDatPositionsCalc_1.colId = dbo.vwCurrPos.Id 
    AND tblDatPositionsCalc_1.colAccount = dbo.vwCurrPos.Account 
and (tblDatPositionsCalc_1.colDate = 
    (SELECT MAX(colDate) AS Expr1 FROM dbo.tblDatPositionsCalc)) 
... 

原因:左加入到列在where子句限制=一些表达不返回“空=东西”所以该行将被删除。 (选项2)与将代码推入更难维护的其他视图相反,您可以嵌套sql select语句;

select 
    X.x1,X.x2, 
    Y.* 
from X 
left join 
    (select Z.z1 as y1, Z.z2 as y2, Z.z3 as y3 
    from Z 
    where Z.z1 = (select max(Z.z1) from Z) 
    ) as Y 
on x.x1 = Y.y1 and X.x2 = Y.y2 

这里的优势是你检查每个嵌套子查询快速移出。虽然如果你仍然建立更多的逻辑检查公用表表达式(CTE的)http://msdn.microsoft.com/en-us/library/ms175972.aspx

+0

在左外连接解决问题后立即添加条件。 – Manuel 2014-10-02 12:10:39