我遇到了问题
我需要选择来自Conto的所有contoNames,它在FromDate和Todate之间是活跃的 如果我在该连接中没有匹配,我需要设置NULL或执行其他操作
但我已经读过,在你的连接表达式中使用AND时,它会在连接之前读取And语句 它的工作原理和Where语句过滤数据。
所以我没有得到一个NULL 在这个例子中 - 该语句给出0行,在该时间跨度内没有contractId
SELECT S.Name, C.ContoName, C.fromDate, C.Todate
From Sales
Left outer Sales S on S.ContractId = C.ContractId AND '2014-12-31' BETWEEN c.fromDate AND C.Todate
这就是我想要在我的左连接中获取NULL值或者做一些决策流程 如果Timespan中没有contractId那么 只加入contractId
SELECT S.Name, C.ContoName, C.fromDate, C.Todate
From Sales
INNER JOIN Sales S on S.ContractId = C.ContractId AND ( '2014-12-31'BETWEEN c.fromDate AND C.Todate OR Sales.ContractId = Conto.ContractId )
不现实AND运算符在执行JOIN
之前就像where语句和过滤数据一样工作SELECT S.Name, coalesce(C.ContoName,C1.ContoName)contoName,C.fromDate,C.Todate
From Sales S
LEFT JOIN Conto C on S.ContractId = C.ContractId
AND '2014-12-31' >BETWEEN c.fromDate AND C.Todate )
LEFT JOIN Conto C1 on S.ContractId = C1.contractId
有没有人有好主意使用tsql或标准sql以一种很好的方式解决这个问题
答案 0 :(得分:1)
如果Timespan中没有contractId则只加入contractId
我正在读这个意思是“如果Timespan中有contractID,那么只显示那些。如果在时间跨度中没有,那么显示那些不在时间范围内的那些。”
如果我读错了,那么你需要澄清你的问题。
如果我是对的,那么你可以使用CASE处理,或者如我所示,使用(AND)OR(AND)结构:
SELECT S.Name, C.ContoName,C.fromDate,C.Todate
From Sales S
LEFT JOIN Conto C
ON (
S.ContractId = C.ContractId
AND '2014-12-31' BETWEEN c.fromDate AND C.Todate
) OR (
S.ContractId = C.ContractId
AND NOT EXISTS(
SELECT * FROM Conto c1
WHERE S.ContractId = c1.ContractId
AND '2014-12-31' BETWEEN c1.fromDate AND c1.Todate
)
)