如何从下面的场景中获得所需的输出

时间:2016-04-08 03:41:21

标签: 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(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  

有人可以指导我吗

2 个答案:

答案 0 :(得分:0)

我有一个使用两个游标的解决方案:

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

使用CTE可能有更好的解决方案,但我对它们并不十分熟悉。

答案 1 :(得分:0)

可能是这样的,使用XML和CASE语句。比游标更有效,

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