我认为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)如何限制子查询中的行数?
我是否需要在子查询内也有一个inner join语句?我希望子查询继承自普通的SELECT,这样我就不需要手动限制了。
列"Field“包含的不仅仅是"Population”,我想在SELECT语句中显示更多的行,但是现在...我甚至连一个栏目都不能用。:-(
发布于 2014-03-10 23:35:02
我认为你想要这样的东西:
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当然,有一些方法可以优化上面的查询,但这总是在可读性和速度之间进行权衡。
祝好运!
发布于 2014-03-11 01:02:34
我认为这样的查询是正确的:
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。这也可以通过交叉应用来完成,但在这种情况下,语法将有所不同。
https://stackoverflow.com/questions/22304299
复制相似问题