我有两张有交通事故的桌子。这些表来自不同的数据库。这些表是P_TRAFFIC_2015和SPV_TRAFFIC_2015。此表之间的唯一关系是列Routenumber。
为了比较这个表中的事故,我比较了roadnumber和事故发生的日期和时间。我是用下面的SQL语句来完成这个任务的。在select语句的结果中,我希望看到P_TRAFFIC_2015表的每一行都添加了“yes”或“no”列。如果此事故与SPV_TRAFFIC_2015表中的一行匹配,则应为“是”,否则为“否”。我可能是多行匹配,在这种情况下,我不想看到多行,它只是一个‘是’。
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中的所有行。所以我看到了一些小插曲。
FROM
P_TRAFFIC_2015 PV
INNER JOIN
SPV_TRAFFIC_2015 SPV ON PV.ROUTENUMBER = SPV.ROUTENUMBER请帮帮我!
谢谢你的帮助!
发布于 2017-01-07 12:48:38
您缺少连接条件。但是,我认为最好的方法是在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中选择更多(或全部)列。发布于 2017-01-07 11:58:42
您应该将查询更改为包含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
1https://stackoverflow.com/questions/41521149
复制相似问题