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


SQL query to get all rows that have data linked by a FK in another table

我有三个表:Station, MonthlyNormalDataSubArea。我在试着找到一个区域内所有至少有一个月数据的站点。使用以下查询,我能够获得子区域中的所有站点,但这忽略了关于月度数据的部分($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 ...

由于您只从表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'