sql 查询以连接和连接值
sql query to join and concat values
sql 服务器:2012
这是 3 tables。
第一个table是用户(顾问)table
第二个是价格 table,第一列的每个用户都有一个价格
最后table定义顾问在哪个地区(城市)提供服务
Consultants Prices Area
uid | Name uid | Price uid | City
----|----- -----|------- ----|------
1 | Dave 1 | 5 1 | NY
2 | Adrian 2 | 7 1 | LA
3 | John 4 | 5 4 | NY
4 | Lee 4 | NO
4 | LA
4 | SF
我需要从所有 table 中 select 像这样:
uid | Price | City
-----|----------|-------
1 | 5 | NY, LA
-----|----------|-------
2 | 7 |
-----|----------|-------
4 | 5 | NY, NO, LA, SF
-----|----------|-------
我该怎么做 select?有什么想法吗?
由于您没有指定数据库,假设 SQL Server 2008,您可以使用 STUFF function and Group BY Clause 将多行连接成单个逗号分隔值
Select C.uid, P.price, ISNULL(A.City,'') City
From Consultants C
INNER JOIN Prices P ON C.uid = P.uid
LEFT JOIN (
SELECT UID
,STUFF((SELECT ', ' + CAST(city AS VARCHAR(10)) [text()]
FROM Area
WHERE UID = t.UID
FOR XML PATH(''), TYPE)
.value('.','NVARCHAR(MAX)'),1,2,' ') CITY
FROM Area t
GROUP BY UID ) A
ON C.uid = A.uid
可能是这样你也可以这样做
declare @consultants table (uid int,name varchar(10))
insert into @consultants (uid,name)values (1,'dave'),(2,'adrian'),(3,'jon'),(4,'lee')
declare @Prices table (uid int,price int)
insert into @Prices(uid,price)values (1,5),(2,7),(4,5)
declare @Area table (uid int,city varchar(5))
insert into @Area(uid,city)values (1,'NY'),(1,'LA'),(4,'NY'),(4,'LA'),(4,'SF'),(4,'NO')
select t.uid,tt.price,ISNULL(STUFF((select +', '+ city from @Area where uid = t.uid FOR XML PATH(''), TYPE)
.value('.','NVARCHAR(MAX)'),1,2,' '),'')CITY from @consultants t INNER JOIN @Prices tt
ON t.uid = tt.uid
sql 服务器:2012
这是 3 tables。
第一个table是用户(顾问)table 第二个是价格 table,第一列的每个用户都有一个价格 最后table定义顾问在哪个地区(城市)提供服务
Consultants Prices Area
uid | Name uid | Price uid | City
----|----- -----|------- ----|------
1 | Dave 1 | 5 1 | NY
2 | Adrian 2 | 7 1 | LA
3 | John 4 | 5 4 | NY
4 | Lee 4 | NO
4 | LA
4 | SF
我需要从所有 table 中 select 像这样:
uid | Price | City
-----|----------|-------
1 | 5 | NY, LA
-----|----------|-------
2 | 7 |
-----|----------|-------
4 | 5 | NY, NO, LA, SF
-----|----------|-------
我该怎么做 select?有什么想法吗?
由于您没有指定数据库,假设 SQL Server 2008,您可以使用 STUFF function and Group BY Clause 将多行连接成单个逗号分隔值
Select C.uid, P.price, ISNULL(A.City,'') City
From Consultants C
INNER JOIN Prices P ON C.uid = P.uid
LEFT JOIN (
SELECT UID
,STUFF((SELECT ', ' + CAST(city AS VARCHAR(10)) [text()]
FROM Area
WHERE UID = t.UID
FOR XML PATH(''), TYPE)
.value('.','NVARCHAR(MAX)'),1,2,' ') CITY
FROM Area t
GROUP BY UID ) A
ON C.uid = A.uid
可能是这样你也可以这样做
declare @consultants table (uid int,name varchar(10))
insert into @consultants (uid,name)values (1,'dave'),(2,'adrian'),(3,'jon'),(4,'lee')
declare @Prices table (uid int,price int)
insert into @Prices(uid,price)values (1,5),(2,7),(4,5)
declare @Area table (uid int,city varchar(5))
insert into @Area(uid,city)values (1,'NY'),(1,'LA'),(4,'NY'),(4,'LA'),(4,'SF'),(4,'NO')
select t.uid,tt.price,ISNULL(STUFF((select +', '+ city from @Area where uid = t.uid FOR XML PATH(''), TYPE)
.value('.','NVARCHAR(MAX)'),1,2,' '),'')CITY from @consultants t INNER JOIN @Prices tt
ON t.uid = tt.uid