首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL。添加“是”或“否”列答案的Select语句奇怪

SQL。添加“是”或“否”列答案的Select语句奇怪
EN

Stack Overflow用户
提问于 2017-01-07 11:53:29
回答 2查看 437关注 0票数 0

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

为了比较这个表中的事故,我比较了roadnumber和事故发生的日期和时间。我是用下面的SQL语句来完成这个任务的。在select语句的结果中,我希望看到P_TRAFFIC_2015表的每一行都添加了“yes”或“no”列。如果此事故与SPV_TRAFFIC_2015表中的一行匹配,则应为“是”,否则为“否”。我可能是多行匹配,在这种情况下,我不想看到多行,它只是一个‘是’。

代码语言:javascript
复制
 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查询也显示了与“否”答案相同的记录。所以我看了很多记录。

当我在FROM (下面)中使用一个联接时,并不会显示P_TRAFFIC_2015中的所有行。所以我看到了一些小插曲。

代码语言:javascript
复制
FROM 
    P_TRAFFIC_2015 PV 
INNER JOIN 
    SPV_TRAFFIC_2015 SPV ON PV.ROUTENUMBER = SPV.ROUTENUMBER

请帮帮我!

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-07 12:48:38

您缺少连接条件。但是,我认为最好的方法是在select中使用子查询

代码语言:javascript
复制
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中选择更多(或全部)列。
  • 这一逻辑非常清楚地说明了旗帜的性质。
票数 0
EN

Stack Overflow用户

发布于 2017-01-07 11:58:42

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41521149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档