【问题标题】:Solving SQL Query Decision making sql解决sql查询决策sql
【发布时间】:2015-05-13 12:57:54
【问题描述】:

我有问题

我需要从 Conto 中选择在 FromDate 和 Todate 之间处于活动状态的所有 contoNames 如果我在那个连接中没有得到匹配,我需要设置一个 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 运算符的作用类似于 where 语句并在执行 JOIN 之前过滤数据

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 以一种很好的方式解决这个问题的好主意

【问题讨论】:

  • 您想查看您的所有联系人,即使他们在一段时间内不活跃?

标签: sql sql-server tsql


【解决方案1】:

如果时间跨度中没有contractId,则仅加入contractId

我读这篇文章的意思是“如果时间跨度中有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 
    )
  )

【讨论】:

  • 非常感谢您对迟到的回复感到抱歉,这对我有用。我应该做些什么来正确地结束这个问题。我不习惯使用stackoverflow。
  • 是的,请单击此答案顶部附近的复选标记符号,这将关闭问题。
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多