2016-07-14 66 views
1

我有一个表格,用于ObjectsPersons之间的多对多关系。它具有以下栏目:查找具有特定值的记录或其他列中的最低记录

  • Object_PersonID(INT)
  • PersonLnk(INT)
  • ObjectLnk(INT)
  • PrincipalPerson(位)

有每个对象的几个记录,每行描述对象的所有者之一。有时会指示对象的主要所有者,但并非总是如此。

对于选择我想找到主事之人(PrincipalPerson=1)如果存在的话,或者对象,对方先注册(为Object_PersonID最低值)。
我当然可以找到其中的一个或所有这些,但需要帮助构建一个查询来检索每个对象的单个记录。

SELECT ObjectLnk,PersonLnk 
FROM Objects_Persons 
WHERE ObjectLnk IN (3381,5717,...,5731) 
    AND ...` 
ORDER BY ObjectLnk; 

非常感激您的帮助......

回答

0

您可以在CTE有两个排序列使用ROW_NUMBER。如果没有PrincipalPerson存在(均为0),你会得到一个最低的Object_PersonID

WITH CTE AS 
(
    SELECT o.*, p.*, -- replace * with explcit columns or aliases 
      RN = ROW_NUMBER() OVER (PARTITION BY ObjectLnk 
            ORDER BY PrincipalPerson DESC, Object_PersonID ASC) 
    FROM Objects_Persons 
    INNER JOIN Objects o ON Objects_Persons.ObjectLnk = o.ObjectId 
    INNER JOIN Persons p ON Objects_Persons.PersonLnk = p.PersonId 
    WHERE ObjectLnk IN (3381,5717,...,5731) 
) 
SELECT * FROM CTE -- replace * with explcit columns or aliases 
WHERE RN = 1 

也许你甚至都不需要,因为你有你在这个关系表所需要的所有信息的加入在这种情况下。然后你可以从CTE中省略它。只是想展示你如何获得所有相关表格的所有信息。

+0

谢谢。让我的一天! –

相关问题