我有三个表:Station
, MonthlyNormalData
和SubArea
。我在试着找到一个区域内所有至少有一个月数据的站点。使用以下查询,我能够获得子区域中的所有站点,但这忽略了关于月度数据的部分($region是PHP脚本中包含地区名称的变量):
SELECT S.station_id, S.name, SA.sub_area_name
FROM dev.Station AS S
INNER JOIN dbo.SubArea AS SA ON S.sub_area_id = SA.sub_area_id
WHERE sub_area_name = '$region'
我还尝试了以下查询,但它返回与站点关联的每个月数据的一行,这并不是我真正要查找的(只查找向我发送至少有一个与之关联的月数据的站点的名称的东西,而不是包含该数据的所有行):
SELECT S.station_id, S.name, SA.sub_area_name
FROM dev.Station AS S
INNER JOIN dbo.SubArea AS SA ON S.sub_area_id = SA.sub_area_id
INNER JOIN data.MonthlyNormalData as MND ON MND.station_id = S.station_id
WHERE sub_area_name = '$region' AND MND.value IS NOT NULL
我需要运行的查询是什么,以便在某个子区域内每个站点只有一行与每月数据相关联?
您可以在第二个查询中使用DISTINCT
来删除重复的行:
SELECT DISTINCT ...
由于您只从表Station
和SubArea
返回记录,使用Distinct
将为您工作。
SELECT distinct S.station_id, S.name, SA.sub_area_name
FROM dev.Station AS S
INNER JOIN dbo.SubArea AS SA ON S.sub_area_id = SA.sub_area_id
INNER JOIN data.MonthlyNormalData as MND ON MND.station_id = S.station_id
WHERE sub_area_name = '$region' AND MND.value IS NOT NULL
另一种方法是使用exist
SELECT S.station_id, S.name, SA.sub_area_name
FROM dev.Station AS S
INNER JOIN dbo.SubArea AS SA ON S.sub_area_id = SA.sub_area_id
WHERE exists (select 1 from data.MonthlyNormalData where station_id = S.station_id) and
sub_area_name = '$region'