解决SQL查询决策的问题

时间:2015-05-13 12:57:54

标签: sql sql-server tsql

我遇到了问题

我需要选择来自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以一种很好的方式解决这个问题

1 个答案:

答案 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 
    )
  )