2014-07-25 29 views
0

我有三个表:StationMonthlyNormalDataSubArea。我试图让一个子区域内的所有站点至少有一个月的数据与之相关联。用下面的查询,我能得到一个子区域中的所有站点,但是这是无视有关月度数据的部分($区域是在我的PHP脚本包含该区域名称的变量):通过SQL查询获取所有具有由另一个表中的FK链接的数据的行

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 

查询我需要运行只有一行pe哪个电台在某个子区域内有与其相关的月度数据?

回答

1

你可以使用DISTINCT在你的第二个查询来删除重复的行:

SELECT DISTINCT ... 
1

因为你是从表中StationSubArea使用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' 
相关问题