Database 从1到多个与条件的关系中选择一条记录

Database 从1到多个与条件的关系中选择一条记录,database,sql-server-2008,Database,Sql Server 2008,我有一张用户表。它有用户名、用户名和电子邮件。我有一个地址表,它有AddressId、Address、Country、Userid和addressType。一个用户可以有家庭或办公室地址(地址类型),也可以同时有家庭或办公室地址(他至少有一个地址) 我需要选择一个地址为的用户。如果用户有办公地址,则应为所选地址。如果办公室地址不可用,则返回家庭地址。 以最高性能实现这一点的方法是什么 USERS ADRESS ------ --------- USER_ID ADDRES

我有一张用户表。它有用户名、用户名和电子邮件。我有一个地址表,它有AddressId、Address、Country、Userid和addressType。一个用户可以有家庭或办公室地址(地址类型),也可以同时有家庭或办公室地址(他至少有一个地址)

我需要选择一个地址为的用户。如果用户有办公地址,则应为所选地址。如果办公室地址不可用,则返回家庭地址。 以最高性能实现这一点的方法是什么

USERS      ADRESS
------     ---------
USER_ID    ADDRESS_ID
USERNAME   ADDRESS
EMAIL      COUNTRY
           USER_ID
           ADDRESS_TYPE
我想我会用一个分析函数来做这件事。行号()在()上,例如:

若地址类型O为office,H为home,则按顺序降序时,O排在第一位,ordr值为1。如果没有办公室地址,则家庭地址为第一个,值为1。使用ordr=1筛选值只会给您一个地址,您可以将其与用户表联接

select *
  from user u,
   (select user_id,
                    row_number() over(partition by user_id order by address_type desc) as     ordr
      from address a) ad
 where u.user_id = ad.user_id
 and ad.ordr= 1
我想我会用一个分析函数来做这件事。行号()在()上,例如:

若地址类型O为office,H为home,则按顺序降序时,O排在第一位,ordr值为1。如果没有办公室地址,则家庭地址为第一个,值为1。使用ordr=1筛选值只会给您一个地址,您可以将其与用户表联接

select *
  from user u,
   (select user_id,
                    row_number() over(partition by user_id order by address_type desc) as     ordr
      from address a) ad
 where u.user_id = ad.user_id
 and ad.ordr= 1
我想我会用一个分析函数来做这件事。行号()在()上,例如:

若地址类型O为office,H为home,则按顺序降序时,O排在第一位,ordr值为1。如果没有办公室地址,则家庭地址为第一个,值为1。使用ordr=1筛选值只会给您一个地址,您可以将其与用户表联接

select *
  from user u,
   (select user_id,
                    row_number() over(partition by user_id order by address_type desc) as     ordr
      from address a) ad
 where u.user_id = ad.user_id
 and ad.ordr= 1
我想我会用一个分析函数来做这件事。行号()在()上,例如:

若地址类型O为office,H为home,则按顺序降序时,O排在第一位,ordr值为1。如果没有办公室地址,则家庭地址为第一个,值为1。使用ordr=1筛选值只会给您一个地址,您可以将其与用户表联接

select *
  from user u,
   (select user_id,
                    row_number() over(partition by user_id order by address_type desc) as     ordr
      from address a) ad
 where u.user_id = ad.user_id
 and ad.ordr= 1
试一试

这假设每个用户至少有一个家庭/办公室,并且没有多个家庭或多个办公室

编辑:另外,如果您想要提高性能,请确保您的地址表有一个UserID索引。当然,Addr应该有一个用于AddrID,用户应该有一个用于UserID。

试试看

这假设每个用户至少有一个家庭/办公室,并且没有多个家庭或多个办公室

编辑:另外,如果您想要提高性能,请确保您的地址表有一个UserID索引。当然,Addr应该有一个用于AddrID,用户应该有一个用于UserID。

试试看

这假设每个用户至少有一个家庭/办公室,并且没有多个家庭或多个办公室

编辑:另外,如果您想要提高性能,请确保您的地址表有一个UserID索引。当然,Addr应该有一个用于AddrID,用户应该有一个用于UserID。

试试看

这假设每个用户至少有一个家庭/办公室,并且没有多个家庭或多个办公室

编辑:另外,如果您想要提高性能,请确保您的地址表有一个UserID索引。当然,Addr应该为AddrID设置一个,用户应该为UserID设置一个