【问题标题】:sql query to join and concat values用于连接和连接值的 sql 查询
【发布时间】:2023-03-14 17:59:01
【问题描述】:

sql 服务器:2012

这是 3 张桌子。

第一个表是用户(顾问)的表 第二个是价格表,第一列的每个用户都有一个价格 最后一张表定义了顾问在哪个地区(城市)提供服务

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

我需要从所有表格中选择如下内容:

uid  |  Price   | City
-----|----------|-------
 1   |    5     | NY, LA
-----|----------|-------
 2   |    7     | 
-----|----------|-------
 4   |    5     | NY, NO, LA, SF
-----|----------|-------

我该如何做这个选择?有什么想法吗?

【问题讨论】:

  • 您可以使用FOR XML PATH。以here 为例。
  • 使用适当的软件(MySQL、Oracle、DB2...)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。

标签: sql sql-server sql-server-2008 tsql sql-server-2005


【解决方案1】:

由于您没有指定数据库,假设 SQL Server 2008,您可以使用 STUFF functionGroup 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

Working SQL Fiddle

【讨论】:

  • 谢谢!你刚刚救了我!
  • 你的数据库、Sql Server 或 My SQL 是什么
  • 我的数据库是 SqlServer。您的解决方案完美!再次感谢您!
【解决方案2】:

也许你也可以这样做

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2011-04-13
    • 2023-03-29
    • 2020-09-27
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多