0

我需要将行号限制为 SQL 查询中的一个唯一行。这是识别我在说什么的示例数据:

john doe 3000 fog horn drive , ky 40444
john doe 3001 merry lane , ky 40484

我想返回列表中的第一个,这是我的查询:

Select 
    DISTINCT p.personID, e.citizenship, 
    rtrim(i.lastname + CASE WHEN i.suffix IS NULL THEN '' ELSE ' ' + i.suffix END) + ', ' + i.firstname + (CASE WHEN i.middlename IS NULL THEN '' ELSE ' ' + i.middlename END) StuName, 
    e.grade, i.gender, p.studentNumber, e.citizenship, e.adult, i.birthdate, 
    e.disability1, e.disability2, ad.city, e.displacedHomemaker, e.homeSchooled, 
    e.localStudentNumber, e.migrant, e.modifiedDate, e.modifiedByID,
    rtrim(Staff.lastname + CASE WHEN Staff.suffix IS NULL THEN '' ELSE ' ' + Staff.suffix END) + ', ' + Staff.firstname + (CASE WHEN Staff.middlename IS NULL THEN '' ELSE ' ' + Staff.middleName END) Staffname, 
    Staff.personID Staffid, i.lastname, i.firstname, i.middlename, i.ssn, 
    ad.phone, ad.state, ad.zip, ad.addressLine1
FROM 
    Person p 
LEFT join 
    Enrollment e ON e.personID = p.personID And isnull(e.noshow, 0) = 0 
LEFT join 
    EnrollmentKY ky ON ky.enrollmentID = e.enrollmentID 
LEFT join 
    [Identity] i ON i.identityID = p.currentIdentityID And i.personID = p.personID 
INNER join 
    Calendar c ON c.calendarID = e.calendarID 
INNER join 
    SchoolYear sy ON sy.endYear = c.endYear AND sy.active = 1 
JOIN 
    staffMember Staff ON Staff.personID = e.modifiedByID 
--join view_students s ON  s.personID = i.personID
left join 
    v_MailingAddress ad ON ad.personID = i.personID And ad.relatedBy = 'household'
                        And ad.endDate IS NULL And isnull(ad.secondary, 0) = 0 
order by 
    i.lastname, i.firstname, i.middlename

编辑:只需要在 SQL 代码中选择第一行,因为我对拥有多个地址的人有疑问,它为他们放置了两行,而对于拥有多个地址的人,我只需要第一行数据。

4

4 回答 4

1

如果personId每个记录的 是不同的并且它们只是具有不同的地址,那么您可以为 添加一个字段,row_number()然后只选择其中的记录row_number = 1

select *
from 
(
  Select p.personID,
    e.citizenship, 
    rtrim(i.lastname + CASE WHEN i.suffix IS NULL THEN '' ELSE ' ' + i.suffix END) + ', ' + i.firstname + (CASE WHEN i.middlename IS NULL THEN '' ELSE ' ' + i.middlename END) StuName, 
    e.grade, 
    i.gender, 
    p.studentNumber, 
    e.citizenship, 
    e.adult, 
    i.birthdate, 
    e.disability1, 
    e.disability2, 
    ad.city, 
    e.displacedHomemaker, 
    e.homeSchooled,
    e.localStudentNumber,
    e.migrant,
    e.modifiedDate,
    e.modifiedByID,
    rtrim(Staff.lastname + CASE WHEN Staff.suffix IS NULL THEN '' ELSE ' ' + Staff.suffix END) + ', ' + Staff.firstname + (CASE WHEN Staff.middlename IS NULL THEN '' ELSE ' ' + Staff.middleName END) Staffname, 
    Staff.personID Staffid,
    i.lastname, 
    i.firstname, 
    i.middlename,
    i.ssn, 
    ad.phone, 
    ad.state, 
    ad.zip, 
    ad.addressLine1,
    row_number() over(partition by p.personid order by p.personid) rn -- add this field
  FROM Person p 
  LEFT join Enrollment e 
    ON e.personID = p.personID 
    And isnull(e.noshow,0)=0 
  LEFT join EnrollmentKY ky 
    ON ky.enrollmentID = e.enrollmentID 
  LEFT join [Identity] i 
    ON i.identityID = p.currentIdentityID 
    And i.personID = p.personID 
  INNER join Calendar c 
    ON c.calendarID = e.calendarID 
  INNER join SchoolYear sy 
    ON sy.endYear = c.endYear 
    AND sy.active = 1 
  JOIN staffMember Staff 
    ON Staff.personID = e.modifiedByID 
  --join view_students s ON  s.personID = i.personID
  left join v_MailingAddress ad 
    ON ad.personID = i.personID 
    And ad.relatedBy = 'household'
    And ad.endDate IS NULL 
    And isnull(ad.secondary,0)=0 
) x
where x.rn = 1
order by x.lastname, x.firstname, x.middlename
于 2012-08-30T15:47:34.643 回答
1

尝试使用LIMIT来限制编号。的输出。

例如:

SELECT COLUMN_NAME
FROM TABLE
ORDER BY CONDITION
LIMIT NO_OF_ROWS;
于 2012-08-30T15:22:25.913 回答
1

您是否尝试过使用“GROUP BY”子句而不是 DISTINCT 关键字?

另外,子查询呢?如果我正在编写这种类型的东西,我会使用存储过程并创建一个临时表。

于 2012-08-30T15:24:43.683 回答
-1

编辑:删除原始答案,因为问题已更改,原始答案不是更改问题的方法。

根据 Neil Hoskins 建议 GROUP BY 子句。

于 2012-08-30T15:21:49.930 回答