我有一张表格,用于Objects
和Persons
之间的多对多关系。它包含以下列:
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 :(得分: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中省略它。只是想展示如何获得所有相关表格的所有信息。