现在,我正在构建一个巨大的db2查询,在这里我从很多表中选择大量数据(10个表以上的LEFT OUTER JOIN)。大多数数据都很好地选择和工作正常,但其中大部分是非常简单的DB2 SQL仅通过子查询才能获得第一个匹配
但有一张桌子给我一点头痛。如果我们只是在查看SQL和结果时,我们不从这张表中选择,它看起来有点像这样:(由于数据的性质,我不能从我的SQL中给出示例)
SQL 1:
SELECT Person.Name, Date.NameOfDate, Location.City
FROM Person LEFT OUTER JOIN
Date ON Person.Id = Date.PersonId LEFT OUTER JOIN
Location ON Date.LocationId = Location.Id
WHERE Person.IsAlive = True
结果1:
Name - NameOfDate - City
Peter - Anna - Athen
Peter - Caroline - Washington
Simone - Carl - Athen
现在我有一个表(姑且称之为 '注释')。这张表格有一些关于城市的额外信息。每个城市可以有多行。例如:
SQL 2:
SELECT Location.City, Comment.Text, Comment.SortingId, Comment.TypeOfData
FROM Location LEFT OUTER JOIN
Comment ON Location.Id = Comment.LocationId
结果2:
City - Text - SortingId - TypeOfData
New York - Do not read this - 1 - 777
Washington - This text is irrelevant - 1 - 555
Washington - Make sure you visit the White House - 2 - 777
Washington - On saturdays there is a market near the docks - 3 - 777
Athen - Bring translator - 1
我的问题是,我需要在SQL 1检索Comment.Text,但只具有最低SortingId行,其中TypeOfData是777.结果应该是这样的:
Name - NameOfDate - City - Text
Peter - Anna - Athen - Bring translator
Peter - Caroline - Washington - Make sure you visit the White House
Simone - Carl - Athen - Bring translator
我已经设法做出的最接近的事情得到这个数据如下:
SELECT Person.Name, Date.NameOfDate, Location.City, Comment.Text
FROM Person LEFT OUTER JOIN
Date ON Person.Id = Date.PersonId LEFT OUTER JOIN
Location ON Date.LocationId = Location.Id LEFT OUTER JOIN
(SELECT Comment.Text FROM Comment ORDER BY Comment.SortingId FETCH FIRST 1 ROWS ONLY) AS Comment ON Location.Id = Comment.LocationId
WHERE Person.IsAlive = True
但正如一些人可能已经注意到,这并不给我任何结果。子选择将返回纽约行,然后它会过滤LocationId,它将删除纽约,不留任何东西
任何其他想法?
编辑:
的评语表没有任何独特的ID字段。你可以有两行,唯一不同的是SortingId,但是相同的SortingId可以用在许多行中,例如SortingId可能是1成两排,不同LocationId
所以你没有得到你所查询的任何行?甚至不是华盛顿和雅典? –
如果只需要一列,请尝试关联的子查询。 – Serg
@Bhavesh - 正确。原因是Erwin Smout提到的。我只得到查询中的前1名,但在这种情况下,前1名将是纽约。然后当我在查询之外有一个WHERE看着LocationId它将不会返回任何 –