Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sql server加入并选择前1名_Sql Server_Tsql - Fatal编程技术网

Sql server sql server加入并选择前1名

Sql server sql server加入并选择前1名,sql-server,tsql,Sql Server,Tsql,我有一个客户表和一个地址表。对于每个客户,地址表中应该有多个地址 我需要一个存储过程来从地址表的顶部选择客户详细信息和他的地址 选择客户的参数是companyID SELECT top 1 s.Addr1 as ShipAddress_Addr1,s.Addr2 as ShipAddress_Addr2,s.Addr3 as ShipAddress_Addr3, s.Addr4 as ShipAddress_Addr4,s.Addr5 as ShipAddress_Addr5,

我有一个客户表和一个地址表。对于每个客户,地址表中应该有多个地址 我需要一个存储过程来从地址表的顶部选择客户详细信息和他的地址 选择客户的参数是companyID

SELECT top 1  s.Addr1 as ShipAddress_Addr1,s.Addr2 as  ShipAddress_Addr2,s.Addr3 as ShipAddress_Addr3,
    s.Addr4 as ShipAddress_Addr4,s.Addr5 as ShipAddress_Addr5,
    s.City as ShipAddress_City,s.[state] as ShipAddress_State,s.PostalCode as ShipAddress_PostalCode,
    s.Country as ShipAddress_Country,s.Note as ShipAddress_Note ,c.CustomerID,c.[TimeCreated], c.[FullName],c.FirstName,c.LastName,c.Phone, c.Email, 
    c.BillAddress_Addr1, c.[BillAddress_Addr2],c. [BillAddress_Addr3],c. [BillAddress_Addr4],c.[BillAddress_Addr5],
     c.BillAddress_City,c.BillAddress_State,c.BillAddress_PostalCode,c.BillAddress_Country,c.BillAddress_Note
        FROM   Customer c left join [dbo].[CustomerShipToAddress] s on s.customerListID=c.CustomerID    
    WHERE c.IsActive = 1 and c.CompanyID = @CompanyID
这将返回第一行。这是你想要的,但不是我想你的意思

如果您想查找此信息以供特定客户使用

SELECT TOP 1, c.customerid, c.name, a.add1  FROM customertable c, addresstable a WHERE c.customerid == a.customerid AND c.customerid == "yourcustomerid"
甚至

SELECT c.customerid, c.name, DISTINCT a.add1  FROM customertable c, addresstable a WHERE c.customerid == a.customerid 

您可以
outer应用每个客户的最新地址,如下所示:

select c.customerid, c.name, c.accno, c.txnid, ta.add1, ta.add2
from customertable c
outer apply (select top 1 a.add1, a.add2 from addresstable a where a.customerid = c.customerid order by a.addressid desc) ta

外部应用中的子查询始终为每个客户返回0或1行,因此当您使用
customertable

将其加入时,它不会导致行重复。在提问之前,您尝试了什么?请查看
交叉应用
顶部
。先自己动手,如果没有成功,请发布您的尝试,我们可以告诉您哪里出了问题。请注意,“前1名”将毫无意义/随机,除非您在地址表的有用列上指定ORDER BY。这不会返回没有地址的客户。而且,即使有多个客户,它也只返回一行。第三个查询甚至不是有效的t-SQL。@AndreyNikolov我知道,我已经在编辑我的答案了。然而,这正是OP的要求。你不能因为这个问题的提出而责怪我。
select c.customerid, c.name, c.accno, c.txnid, ta.add1, ta.add2
from customertable c
outer apply (select top 1 a.add1, a.add2 from addresstable a where a.customerid = c.customerid order by a.addressid desc) ta