SQL查询以获取在另一个表中具有由FK链接的数据的所有行

时间:2014-07-25 18:42:08

标签: php sql sql-server

我有三个表:StationMonthlyNormalDataSubArea。我试图让一个子区域中的所有站点至少有一个月度数据与之相关联。通过以下查询,我可以获取子区域中的所有工作站,但这是忽略关于月度数据的部分($ 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

我需要运行的查询是什么,每个站只有一行,在某个子区域内有与之关联的月度数据?

2 个答案:

答案 0 :(得分:1)

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

SELECT DISTINCT ...

答案 1 :(得分:1)

由于您只使用Station从表SubAreaDistinct返回记录,因此对您有效。

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'