在SELECT中限制SQL子查询

在SELECT中限制SQL子查询,sql,sql-server,subquery,Sql,Sql Server,Subquery,我认为select语句中的子查询将受到FROM和/或JOIN语句的限制。 因此,我的查询总是返回一个错误,因为子查询中有多行 SELECT dbo.Countries.Name, dbo.Countries.ISO2, (SELECT dbo.CountryFields.Field FROM dbo.CountryFields WHERE dbo.CountryFields.Field = 'Population') AS Po

我认为select语句中的子查询将受到FROM和/或JOIN语句的限制。 因此,我的查询总是返回一个错误,因为子查询中有多行

SELECT
      dbo.Countries.Name,
      dbo.Countries.ISO2,
      (SELECT dbo.CountryFields.Field 
       FROM dbo.CountryFields 
       WHERE dbo.CountryFields.Field = 'Population') AS Population
FROM
      dbo.CountryFields
      INNER JOIN
      dbo.Countries ON (dbo.CountryFields.Countries_Id = dbo.Countries.Countries_Id)
如何限制子查询中的行数

我需要在子查询中也有一个内部连接语句吗?我希望子查询将继承普通SELECT,因此不需要手动限制


列“Field”包含的比“Population”更多,我想在SELECT语句中用subselect显示更多行,但现在。。。我甚至连一个专栏都做不到-(

我想你想要这样的东西:

SELECT
      a.Name,
      a.ISO2,
      (SELECT TOP 1 b.Field FROM dbo.CountryFields b WHERE b.Countries_Id = a.Countries_Id AND b.Field = 'Population') AS Population,
      (SELECT TOP 1 b.Field FROM dbo.CountryFields b WHERE b.Countries_Id = a.Countries_Id AND b.Field = 'Capital') AS Capital,
      (SELECT TOP 1 b.Field FROM dbo.CountryFields b WHERE b.Countries_Id = a.Countries_Id AND b.Field = 'Area') AS Area
FROM
      dbo.Countries a
当然,有一些方法可以优化上面的查询,但它始终是可读性和速度之间的折衷


祝你好运!

我认为这样的查询是正确的:

  SELECT
    C.Name,
    C.ISO2,
    ISNULL(CF_POP.Value,0) AS [Population], 
    ISNULL(CF_F2.Value,0) AS [Field2], 
    ISNULL(CF_F3.Value,0) AS [Field3] 
  FROM
    dbo.Countries AS C 
    LEFT JOIN dbo.CountryFields AS CF_POP ON (C.Countries_Id = CF_POP.Countries_Id) AND (CF_POP.Field = 'Population') 
    LEFT JOIN dbo.CountryFields AS CF_F2 ON (C.Countries_Id = CF_F2.Countries_Id) AND (CF_F2.Field = 'Field2') 
    LEFT JOIN dbo.CountryFields AS CF_F3 ON (C.Countries_Id = CF_F3.Countries_Id) AND (CF_F3.Field = 'Field3') 

在本例中,您将
CountryFields
中的每一行连接为一列。我使用LEFT JOIN,因为我不知道您的数据有多完整(如果要查看空格,必须删除ISNULL)。我还将列
设置为Value
,因为我假设必须有第二列对应于
CountryFields.Field
。这也可以通过交叉应用来实现,但在这种情况下,语法会有所不同。

这两个表的结构是什么,以及
dbo.CountryFields
中的行示例?您可以更正具有与当前行相关的条件的子查询,但使用联接可能更好。
OUTER APPLY
在这种情况下可能更有效,但两者都很慢。