我有三个表: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
我需要运行的查询是什么,每个站只有一行,在某个子区域内有与之关联的月度数据?
答案 0 :(得分:1)
您可以在第二个查询中使用DISTINCT
删除重复的行:
SELECT DISTINCT ...
答案 1 :(得分:1)
由于您只使用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'