我有两张交通事故表。这些表来自不同的数据库。这些表格为P_TRAFFIC_2015
和SPV_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
请帮忙!
感谢您的帮助!
答案 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
中选择更多(或全部)列更容易。