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