在SELECT中限制SQL子查询
我认为select语句中的子查询将受到FROM和/或JOIN语句的限制。 因此,我的查询总是返回一个错误,因为子查询中有多行在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
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
在这种情况下可能更有效,但两者都很慢。