在其他列

时间:2016-07-14 08:24:04

标签: sql-server-2008 tsql

我有一张表格,用于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;

迫切需要任何帮助......

1 个答案:

答案 0 :(得分:0)

您可以在ROW_NUMBER中使用CTE,其中包含两个排序列。如果不存在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中省略它。只是想展示如何获得所有相关表格的所有信息。