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