SQL。选择声明并添加“是”'或者没有'专栏答案很奇怪

时间:2017-01-07 11:53:29

标签: sql select case

我有两张交通事故表。这些表来自不同的数据库。这些表格为P_TRAFFIC_2015SPV_TRAFFIC_2015。这些表之间的唯一关系是列Routenumber

为了比较这些表格中的事故,我比较了roadnumber和事故发生的日期和时间。我使用下面的SQL语句执行此操作。在select语句的结果中,我希望查看P_TRAFFIC_2015表的每一行,并添加“是”'或者没有'柱。如果此事故与SPV_TRAFFIC_2015表格中的一行匹配,则应为“是”,否则为“否”#39;。我可能会有多行匹配,在这种情况下,我不想看到多行,它只是一个'是'。

 select 
     PV.TRAFFIC_2015_NR,PV.DATE_AND_TIME,
     case 
        when PV.ROUTENUMBER = SPV.ROUTENUMBER 
             and DATEDIFF(MINUTE, PV.DATE_AND_TIME, SPV.DATE_AND_TIME) BETWEEN -60 AND 60 
           then 'YES' 
           else 'NO' 
     end
 from
     P_TRAFFIC_2015 PV, SPV_TRAFFIC_2015 SPV
 group by 
     PV.TRAFFIC_2015_NR, PV.DATE_AND_TIME,
     case 
        when PV.ROUTENUMBER = SPV.ROUTENUMBER 
             and DATEDIFF(MINUTE,PV.DATE_AND_TIME,SPV.DATE_AND_TIME) BETWEEN -60 AND 60 
            then 'YES' 
            else 'NO' 
     end
order by 
    1

但是有了这个SELECT声明,当答案是“是”时,我会得到奇怪的结果。 SELECT查询还会显示相同的记录,其中包含' no'回答。所以我看到许多记录。

当我在FROM(下面)中使用连接时,并不显示P_TRAFFIC_2015中的所有行。所以我看到了几行。

FROM 
    P_TRAFFIC_2015 PV 
INNER JOIN 
    SPV_TRAFFIC_2015 SPV ON PV.ROUTENUMBER = SPV.ROUTENUMBER

请帮忙!

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

考虑到可能没有所有匹配的记录,您应该更改查询以包含JOIN(包含LEFT OUTER JOIN

SELECT 
    PV.TRAFFIC_2015_NR, PV.DATE_AND_TIME,
    CASE 
       WHEN DATEDIFF(MINUTE, PV.DATE_AND_TIME, SPV.DATE_AND_TIME) BETWEEN -60 AND 60 
          THEN 'YES' 
          ELSE 'NO' 
    END AS computed_column
FROM 
    P_TRAFFIC_2015 PV
LEFT JOIN 
    SPV_TRAFFIC_2015 SPV ON PV.ROUTENUMBER = SPV.ROUTENUMBER
GROUP BY
    PV.TRAFFIC_2015_NR, PV.DATE_AND_TIME
ORDER BY 
    1

答案 1 :(得分:0)

您缺少加入条件。但是,我认为最好的方法是select

中的子查询
select pv.*,
       (case when exists (select 1
                          from SPV_TRAFFIC_2015 spv
                          where PV.ROUTENUMBER = SPV.ROUTENUMBER and
                                DATEDIFF(MINUTE, PV.DATE_AND_TIME, SPV.DATE_AND_TIME) BETWEEN -60 AND 60 
                         )
            then 'YES' 
            else 'NO' 
        end) 
from P_TRAFFIC_2015 PV;

join相比,这有几个优点:

  • 外部查询中不需要group by
  • pv中选择更多(或全部)列更容易。
  • 逻辑非常清楚旗帜的性质。