sql - 如何在 SQL 的 IN 语句中使用逗号分隔值列?
问题描述
我有下表,相关列包含使用 id 列引用自身的 id
id name relate
1 James 1
2 John 1-2
3 Bob 1-2-3
我正在处理下面的查询,但没有工作
SELECT id, name, (
SELECT zrelate =
Stuff
(
(
SELECT ', ' + name AS [text()] FROM
(
SELECT name
FROM myTable
WHERE id IN REPLACE(relate,'-',',')
) x
For XML PATH ('')
),1,1,''
)
) 'zrelate'
FROM myTable
预期的输出是
id name zrelate
1 James James
2 John James,John
3 Bob James,John,Bob
这是一个来自未知数据库的设计糟糕的表,但当前加载到 SQL 2012 中。目标是为用户提取数据并出于明显的原因删除该表。
解决方案
修复设计,修复问题。相反,您应该有 2 张桌子,一张与人有关,另一张与关系有关。
这为您提供了这样的设计:
CREATE TABLE dbo.Person (id int NOT NULL PRIMARY KEY,
[name] varchar(5));
GO
CREATE TABLE dbo.Relation(ParentID int, ChildId int);
ALTER TABLE dbo.Relation ADD CONSTRAINT FK_ParentPerson FOREIGN KEY (ParentID) REFERENCES dbo.Person(id);
ALTER TABLE dbo.Relation ADD CONSTRAINT FK_ChildPerson FOREIGN KEY (ChildID) REFERENCES dbo.Person(id);
您的数据将如下所示:
INSERT INTO dbo.Person (id, [name])
VALUES (1,'James'),
(2,'John'),
(3,'Bob')
INSERT INTO dbo.Relation
VALUES(1,1),
(2,1),
(2,1),
(3,1),
(3,2),
(3,2);
然后,最后,你得到一个像这样的标准化数据集:
SELECT P.id,
P.name,
C.name
FROM dbo.Person P
JOIN dbo.Relation R ON P.id = R.ParentID
JOIN dbo.Person C ON R.ChildId = C.id;
推荐阅读
- php - php 将更多数组保存到 MySQL
- jquery - CSS动画:每个单词的淡入+变换动画不起作用
- c# - Lambdas 和条件:任何人都可以看到 C# 编译器无法解决以下问题的原因吗?
- ruby-on-rails - Rails 在两个应用程序之间共享 Active Storage(服务 AWS)
- python - 对音频流使用多处理
- python - Wrong conversion of datetime timezone aware object in template Django
- qt - 图表中 LineSeries 的中继器
- r - 我们如何找到数据的平滑函数?
- r - 将数据设置为 xts 时处理“丢失”时间
- javascript - http响应中的角度怪异行为