sql - 如何使用连接查询一列中有多个值的表

标签 sql sql-server tsql sql-server-2012 inner-join

表 1:

A       B       C
Test    1       This
Test1   1;4     That
Test2   7       What
Test3   6;2     Which
Test4   1;2;7   Where

表 2:

X       Z
1       Sun
2       Mon
3       Tue
4       Wed
5       Thu
6       Fri
7       Sat

SQL:

Select
    t1.A,
    t2.Z
from
    [dbo].[Table 1] t1
    inner join [dbo].[Table2] t2
    on t1.B = t2.X

它仅适用于 B 列中只有 1 个条目的行,但在 2 个或更多条目时失败。

如何修改 Sql 以便它给出如下结果:

A       Z
Test    Sun
Test1   Sun;Wed
Test2   Sat
Test3   Fri;Mon
Test4   Sun;Mon;Sat

最佳答案

字符串和 XML 的乐趣,这里有一个用于标记数据的小(缩小)技术。

创建一些示例数据

Declare @Table1 table (A varchar(100),B varchar(100), C varchar(100))
Insert Into @Table1 values
('Test','1','This'),('Test1','1;4','That'),('Test2','7','What'),('Test3','6;2','Which'),('Test4','1;2;7','Where')

Declare @Table2 table (X int,Z varchar(100))
Insert Into @Table2 values
(1,'Sun'),(2,'Mon'),(3,'Tue'),(4,'Wed'),(5,'Thu'),(6,'Fri'),(7,'Sat')
<小时/>

SQL

Declare @XML xml,@Str varchar(max) = (Select a,z='['+replace(b,';','];[')+']' From  @Table1 For XML Raw)
Select @Str = Replace(@Str,'['+cast(X as varchar(25))+']',Z) From  @Table2
Select @XML = @Str

Select a = r.value('@a','varchar(100)')
      ,z = r.value('@z','varchar(100)')
From  @XML.nodes('/row') as A(r)

返回

a       z
Test    Sun
Test1   Sun;Wed
Test2   Sat
Test3   Fri;Mon
Test4   Sun;Mon;Sat

关于sql - 如何使用连接查询一列中有多个值的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43145187/

相关文章:

sql-server - SQL Server - 在非索引字段上连接时用 OR 代替

SQL存储过程执行计划性能不佳——参数嗅探

tsql - 使用 xpath 从 xml 数据库列中选择多行(可能没有光标?)

sql - 在 Sql Server 2008 中记录所有用户请求操作 : (inserts, 更新、删除的最佳方法是什么?

sql - 如何在此 SQL Pivot 查询中插入 TOTAL 列?

sql - 计算Oracle中两个时间戳之间的差异(以毫秒为单位)

mysql - SQL where 存在,同时保留它们之间的值

php - SQL获取带有子类别的类别

sql-server - SQL Server 2014 Service Broker 不激活从队列接收消息的过程

c# - 阅读器关闭时调用 Read 的尝试无效。 (C#)