Tsql 如何从下面的场景中获得所需的输出
我在采访中被问到这个问题,期望的结果是Tsql 如何从下面的场景中获得所需的输出,tsql,Tsql,我在采访中被问到这个问题,期望的结果是 CREATE TABLE1 (ID1 INT, ID2 VARCHAR(25)) INSERT INTO TABLE1 (1,'A') INSERT INTO TABLE1 (2,'A,B') INSERT INTO TABLE1 (3,'A,B,C') INSERT INTO TABLE1 (4,'A,D') INSERT INTO TABLE1 (5,'A,B,C,D,E') CREATE TABLE2 (ID1 VARCHAR(
CREATE TABLE1 (ID1 INT, ID2 VARCHAR(25))
INSERT INTO TABLE1 (1,'A')
INSERT INTO TABLE1 (2,'A,B')
INSERT INTO TABLE1 (3,'A,B,C')
INSERT INTO TABLE1 (4,'A,D')
INSERT INTO TABLE1 (5,'A,B,C,D,E')
CREATE TABLE2 (ID1 VARCHAR(25), ID2 VARCHAR(25))
INSERT INTO TABLE2 ('A','AAA')
INSERT INTO TABLE2 ('B','BBB')
INSERT INTO TABLE2 ('C','CCC')
INSERT INTO TABLE2 ('D','DDD')
INSERT INTO TABLE2 ('E','EEE')
有人能给我介绍一下吗?我有一个解决方案,可以使用两个游标:
COLUMN1 | COLUMN2
1 | AAA
2 | AAA,BBB
3 | AAA,BBB,CCC
4 | AAA,DDD
5 | AAA,BBB,CCC,DDD,EEE
使用
CTE
s可能有更好的解决方案,但我对它们不太熟悉。可能是这样的,使用XML和CASE语句。比游标更有效
DECLARE @id INT
DECLARE @string VARCHAR(25)
DECLARE @char VARCHAR(25)
DECLARE @replacement VARCHAR(25)
DECLARE @counter INT
DECLARE @result TABLE(COLUMN1 INT, COLUMN2 VARCHAR(25))
DECLARE @resultId INT = 1
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR FAST_FORWARD
FOR
SELECT ID1, ID2
FROM TABLE1
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @id, @string
WHILE @@FETCH_STATUS = 0
BEGIN
SET @counter = 0
DECLARE @MySecondCursor CURSOR
SET @MySecondCursor = CURSOR FAST_FORWARD
FOR
SELECT ID1, ID2
FROM TABLE2
OPEN @MySecondCursor
FETCH NEXT FROM @MySecondCursor
INTO @char, @replacement
WHILE @@FETCH_STATUS = 0
BEGIN
IF @counter = 0
BEGIN
INSERT INTO @result(COLUMN1, COLUMN2) SELECT @resultId, REPLACE(@string, @char, @replacement)
SET @counter = @counter + 1
END
ELSE
BEGIN
UPDATE @result SET COLUMN2 = (SELECT REPLACE(COLUMN2, @char, @replacement))
WHERE COLUMN1 = @resultId
END
FETCH NEXT FROM @MySecondCursor
INTO @char, @replacement
END
CLOSE @MySecondCursor
DEALLOCATE @MySecondCursor
SET @resultId = @resultId + 1
FETCH NEXT FROM @MyCursor
INTO @id, @string
END
SELECT COLUMN1, COLUMN2 FROM @result
我希望您只是粘贴了create和insert语句,而不是从头开始编写它们。由于表格创建和insert语句都不正确,您将无法通过面试。@Babu-如果我的答案(查询)符合您的要求,请您投票表决我的答案好吗?谢谢纳文,我是新来的,需要更多的名声。当我获得一些声誉的时候,我会做的第一件事就是投票选出答案。再次感谢你提醒我这么做。@Babulal,你好,一旦你有足够的声誉,你将能够投票支持你认为有用的问题和答案。这就是SO中“谢谢你”的方式。@AbdulRasheed:-)
SELECT Id1,
CASE WHEN id2 = 'A' THEN (SELECT ID2 FROM TABLE2 where ID1 = 'A')
WHEN id2 = 'A,B' THEN (SELECT SUBSTRING (
(
SELECT ','+ ID2 as [text()]
FROM TABLE2 where ID1 in ('A', 'B')
For XML PATH ('')
), 2, 1000))
WHEN id2 = 'A,B,C' THEN (SELECT SUBSTRING (
(
SELECT ','+ ID2 as [text()]
FROM TABLE2 where ID1 in ('A', 'B', 'C')
For XML PATH ('')
), 2, 1000))
WHEN id2 = 'A,D' THEN (SELECT SUBSTRING (
(
SELECT ','+ ID2 as [text()]
FROM TABLE2 where ID1 in ('A', 'D')
For XML PATH ('')
), 2, 1000))
WHEN id2 = 'A,B,C,D,E' THEN (SELECT SUBSTRING (
(
SELECT ','+ ID2 as [text()]
FROM TABLE2 where ID1 in ('A', 'B', 'C', 'D', 'E')
For XML PATH ('')
), 2, 1000)) END AS Result
FROM TABLE1