我在創建一些SQL(對於SQL Server 2008)時遇到了一些麻煩。從現有表的分組子字符串創建新表
我是優先級排序,以逗號分隔的任務的任務表:
Id = 1, LongTaskName = "a,b,c"
Id = 2, LongTaskName = "a,c"
Id = 3, LongTaskName = "b,c"
Id = 4, LongTaskName = "a"
etc...
我試圖建立一個新表,通過第一個任務組他們,包含ID:
GroupName: "a", TaskId: 1
GroupName: "a", TaskId: 2
GroupName: "a", TaskId: 4
GroupName: "b", TaskId: 3
這裏是天真的,緩慢的,LINQ代碼:
foreach(var t in Tasks)
{
var gt = new GroupedTasks();
gt.TaskId = t.Id;
var firstWord = t.LongTaskName.Split(',');
if(firstWord.Count() > 0)
{
gt.GroupName = firstWord.First();
}
else
{
gt.GroupName = t.LongTaskName;
}
GroupedTasks.InsertOnSubmit(gt);
}
我寫了一個SQL函數做STRI ng分裂:
create function fn_Split(
@String nvarchar (4000),
@Delimiter nvarchar (10)
)
returns nvarchar(4000)
begin
declare @FirstComma int
set @FirstComma = charindex(@Delimiter,@String)
if(@FirstComma = 0)
return @String
return substring(@String, 0, @FirstComma)
end
go
但是,我陷入了真正的SQL來做這項工作。 我可以獨自一人的羣組:
SELECT dbo.fn_Split(LongTaskName, ',')
FROM [dbo].[Tasks]
GROUP BY dbo.fn_Split(LongTaskName, ',')
而且我知道我需要低着頭像這樣:
DECLARE @RowSet TABLE (GroupName nvarchar(1024), Id nvarchar(5))
insert into @RowSet
select ???
FROM [dbo].Tasks as T
INNER JOIN
(
SELECT dbo.fn_Split(LongTaskName, ',')
FROM [dbo].[Tasks]
GROUP BY dbo.fn_Split(LongTaskName, ',')
) G
ON T.??? = G.???
ORDER BY ???
INSERT INTO dbo.GroupedTasks(GroupName, Id)
select * from @RowSet
但我不太groking如何引用分組的關係,感到困惑關於不得不多次呼叫拆分。
有什麼想法?
哇,很好。問題實際上是彌補的。這是我正在處理的一次性導入問題的簡化版本,所以我不必重新運行它。但非常感謝你的出色答案,並指出了潛在的問題! – teleball