在SQL Server中剥离字符后显示整个表

在SQL Server中剥离字符后显示整个表,sql,sql-server,Sql,Sql Server,这个问题有两个部分 第一部分 我有一张“组”表: 请注意,并非“person”列中的所有数据都具有相同的格式 在SQL Server中,我使用以下查询从Person列中删除“Person”字符: SELECT REPLACE([person],'Person ','') AS [person] FROM Groups 我没有在上面的查询中使用UPDATE,因为我不想更改表中的数据 查询返回了以下结果: person ------ 10 11 12 但是,我希望得到以下结果: group_ID

这个问题有两个部分

第一部分 我有一张“组”表:

请注意,并非“person”列中的所有数据都具有相同的格式

在SQL Server中,我使用以下查询从Person列中删除“Person”字符:

SELECT
REPLACE([person],'Person ','')
AS [person]
FROM Groups
我没有在上面的查询中使用UPDATE,因为我不想更改表中的数据

查询返回了以下结果:

person
------
10
11
12
但是,我希望得到以下结果:

group_ID     person
-------------------
1            10
2            11
3            Jack
4            12
我的问题应该是什么才能达到这个结果

第二部分 我还有一张“详细信息”表:

根据第1部分中的预期结果,“person”列中的数字与表“Details”的“group1”和“group2”中的数字相对应,我如何有选择地将“person”中的数字转换为整数并与“Details”连接

请注意,第1部分中“person”下的所有数据都是字符串(nvarchar(100))

以下是预期的查询输出:

detail_ID     group1     group2
-------------------------------
100           10         11
101           Jack       12

请注意,我不希望永久更改这两个表中的任何内容,上面的预期输出只是SELECT查询的结果。

尝试以下查询,它将为您提供所需的输出

;WITH MT AS
(
  SELECT
  GroupId, REPLACE([person],'Person ','') Person
  AS [person]
  FROM Groups
)
SELECT Detail_Id , MT1.Person AS group1 , MT2.Person AS AS group2    
 FROM    
Details D 
INNER JOIN MT MT1 ON MT1.GroupId = D.group1
INNER JOIN MT MT2 ON MT2.GroupId= D.group2

我认为第一部分在这里不是问题。您的查询工作正常,符合预期结果

模式:

CREATE TABLE #Groups (group_ID INT, person VARCHAR(50));
INSERT INTO #Groups
SELECT 1,'Person 10'
UNION ALL
SELECT 2,'Person 11'
UNION ALL
SELECT 3,'Jack'
UNION ALL
SELECT 4,'Person 12';


CREATE TABLE #Details(detail_ID INT,group1 INT, group2 INT);
INSERT INTO #Details
SELECT 100, 1, 2
UNION ALL
SELECT 101, 3, 4 ;
;WITH CTE AS(
SELECT group_ID
,REPLACE([person],'Person ','') AS person 
FROM #Groups
)
SELECT D.detail_ID, G1.person, G2.person
FROM #Details D
INNER JOIN CTE G1 ON D.group1 = G1.group_ID  
INNER JOIN CTE G2 ON D.group1 = G2.group_ID  
+-----------+--------+--------+
| detail_ID | person | person |
+-----------+--------+--------+
|       100 | 10     | 10     |
|       101 | Jack   | Jack   |
+-----------+--------+--------+
第1部分:

CREATE TABLE #Groups (group_ID INT, person VARCHAR(50));
INSERT INTO #Groups
SELECT 1,'Person 10'
UNION ALL
SELECT 2,'Person 11'
UNION ALL
SELECT 3,'Jack'
UNION ALL
SELECT 4,'Person 12';


CREATE TABLE #Details(detail_ID INT,group1 INT, group2 INT);
INSERT INTO #Details
SELECT 100, 1, 2
UNION ALL
SELECT 101, 3, 4 ;
;WITH CTE AS(
SELECT group_ID
,REPLACE([person],'Person ','') AS person 
FROM #Groups
)
SELECT D.detail_ID, G1.person, G2.person
FROM #Details D
INNER JOIN CTE G1 ON D.group1 = G1.group_ID  
INNER JOIN CTE G2 ON D.group1 = G2.group_ID  
+-----------+--------+--------+
| detail_ID | person | person |
+-----------+--------+--------+
|       100 | 10     | 10     |
|       101 | Jack   | Jack   |
+-----------+--------+--------+
对我来说,你的问题正是你所期望的

SELECT group_ID,REPLACE([person],'Person ','') AS person 
FROM #Groups


+----------+--------+
| group_ID | person |
+----------+--------+
|        1 | 10     |
|        2 | 11     |
|        3 | Jack   |
|        4 | 12     |
+----------+--------+
第二部分:

CREATE TABLE #Groups (group_ID INT, person VARCHAR(50));
INSERT INTO #Groups
SELECT 1,'Person 10'
UNION ALL
SELECT 2,'Person 11'
UNION ALL
SELECT 3,'Jack'
UNION ALL
SELECT 4,'Person 12';


CREATE TABLE #Details(detail_ID INT,group1 INT, group2 INT);
INSERT INTO #Details
SELECT 100, 1, 2
UNION ALL
SELECT 101, 3, 4 ;
;WITH CTE AS(
SELECT group_ID
,REPLACE([person],'Person ','') AS person 
FROM #Groups
)
SELECT D.detail_ID, G1.person, G2.person
FROM #Details D
INNER JOIN CTE G1 ON D.group1 = G1.group_ID  
INNER JOIN CTE G2 ON D.group1 = G2.group_ID  
+-----------+--------+--------+
| detail_ID | person | person |
+-----------+--------+--------+
|       100 | 10     | 10     |
|       101 | Jack   | Jack   |
+-----------+--------+--------+
结果:

CREATE TABLE #Groups (group_ID INT, person VARCHAR(50));
INSERT INTO #Groups
SELECT 1,'Person 10'
UNION ALL
SELECT 2,'Person 11'
UNION ALL
SELECT 3,'Jack'
UNION ALL
SELECT 4,'Person 12';


CREATE TABLE #Details(detail_ID INT,group1 INT, group2 INT);
INSERT INTO #Details
SELECT 100, 1, 2
UNION ALL
SELECT 101, 3, 4 ;
;WITH CTE AS(
SELECT group_ID
,REPLACE([person],'Person ','') AS person 
FROM #Groups
)
SELECT D.detail_ID, G1.person, G2.person
FROM #Details D
INNER JOIN CTE G1 ON D.group1 = G1.group_ID  
INNER JOIN CTE G2 ON D.group1 = G2.group_ID  
+-----------+--------+--------+
| detail_ID | person | person |
+-----------+--------+--------+
|       100 | 10     | 10     |
|       101 | Jack   | Jack   |
+-----------+--------+--------+

第一个查询有效

declare     @T table (id int primary key, name varchar(10));
insert into @T values 
       (1, 'Person 10')
     , (2, 'Person 11')
     , (3, 'Jack')
     , (4, 'Person 12');
declare     @G table (id int primary key, grp1 int, grp2 int);
insert into @G values  
       (100, 1, 2)
     , (101, 3, 4);
with cte as 
( select t.id, t.name, ltrim(rtrim(replace(t.name, 'person', ''))) as sp 
    from @T t 
)
-- select * from cte order by cte.id;
select g.id, c1.sp as grp1, c2.sp as grp2
  from @G g 
  join cte c1
    on c1.id = g.grp1 
  join cte c2
    on c2.id = g.grp2 
 order 
    by g.id;

id          grp1        grp2
----------- ----------- -----------
100         10          11
101         Jack        12

(1) 你的问题太宽泛了,因为它是两个问题。(2) 对于第一部分,查询应该执行您想要的操作。
选择group\u ID,替换([person]、'person'、'')FROM…