I have a table that I'm trying to duplicate every row of, but with one column having a different value. The problem is getting that value involves another table which has no current relation.
Table Search:
| SearchID | Name |
|---|---|
| 1 | A 1 |
| 2 | B 1 |
| 3 | C 1 |
| 4 | A 2 |
| 5 | B 2 |
| 6 | C 2 |
Table SearchFields:
| SearchFieldID | SearchID | Foo |
|---|---|---|
| 1 | 1 | bob |
| 2 | 1 | mary |
| 3 | 2 | tim |
| 4 | 2 | justin |
| 5 | 3 | jay |
| 6 | 3 | anthony |
What I'm trying to get is Table SearchFields to look like this:
Table Expected SearchFields:
| SearchFieldID | SearchID | Foo |
|---|---|---|
| 1 | 1 | bob |
| 2 | 1 | mary |
| 3 | 2 | tim |
| 4 | 2 | justin |
| 5 | 3 | jay |
| 6 | 3 | anthony |
| 7 | 4 | bob |
| 8 | 4 | mary |
| 9 | 5 | tim |
| 10 | 5 | justin |
| 11 | 6 | jay |
| 12 | 6 | anthony |
The only relation I can see is part of the Name column on Search (everything up to the last space gives me duplicate rows, and I can take the higher SearchId from each duplicate to give me the new SearchId to use)
So far I've been able to do things like:
select
max(search.searchid) [SearchId],
substring( name,
1,
len(name) - charindex(' ', reverse(name))) [Name]
from search
group by
substring( name,
1,
len(name) - charindex(' ', reverse(name)))
This gives me
| SearchID | Name |
|---|---|
| 4 | A |
| 5 | B |
| 6 | C |
But I'm not sure how I can take those results and map them to SearchFields, to do something like:
;with cte (searchid, name)
as
(
select
max(search.searchid) [SearchId],
substring( name,
1,
len(name) - charindex(' ', reverse(name))) [Name]
from search
group by
substring( name,
1,
len(name) - charindex(' ', reverse(name)))
)
-- this part obviously wrong, not sure how to connect the two
insert into SearchFields(SearchId, Foo)
select c.SearchId, sf.Foo from cte c
union all
select Foo from SearchFields sf
CodePudding user response:
Think I figured it out.
insert into searchfields(searchid, Foo)
select
(
select top 1 searchid from search where searchid =
(select top 1 max(s.searchid)
from search s
group by
substring(name, 1, len(name) - charindex(' ', reverse(name)))
having sf.searchid = min(s.searchid))
) [SearchId], Foo
from searchfields sf
order by searchid
