Нужна помощь в написании SQL-запроса? - PullRequest
1 голос
/ 18 мая 2011

У меня есть таблица SQL со столбцом, который содержит строку типа 'type | type1 | type2 | type3 | type4'.Мне нужно выбрать строку, идентификатор.Разбейте строку и вставьте в другую таблицу.Первый элемент должен быть по умолчанию, и мне нужно получить его идентификатор и вставить в другую таблицу со значением типа.

Пожалуйста, помогите мне создать запрос T-SQL для достижения желаемого результата.

Пример

Шаг 1 Чтобы выбрать элементы из таблицы 1.
Шаг 2 Разделить на массив
Шаг 3 Вставить в Таблица 2 (первый элемент будет использоваться по умолчанию)
Шаг 4 Обновить Таблица 1 со значением типа по умолчанию на основе TypeID и по умолчанию True

Таблица 1

ID       Items                           Default
--------------------------------------------------
1        type|type1|type2|type3|type4
2        type|type1|type2|type3|type4

Таблица 2

ID   TypeID        Type    Default(bool)
--------------------------------------------------
1    1             type1   1
2    1             type2   0

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Использование функции разделения из ответа Арнольда Фриббла на этой теме

Create FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )
GO

Вы можете написать следующее (я догадался о поле идентификатора в table2 и о том, каким должен быть defaultTypeID в table1, но вы должны это отрегулировать)

CREATE TABLE #table1       ( 
     id            INT, 
     items         VARCHAR(MAX), 
     defaulttypeid INT 
  ) 

CREATE TABLE #table2       ( 
     id        INT IDENTITY, 
     typeid    INT, 
     TYPE      VARCHAR(5), 
     isdefault BIT 
  ) 

INSERT INTO #table1 
VALUES      (1, 
             'type|type1|type2|type3|type4', 
             NULL), 
            (2, 
             'type|type1|type2|type3|type4', 
             NULL) 


INSERT INTO #table2 
            (typeid, 
             TYPE, 
             isdefault) 
SELECT id             typeid, 
       Rtrim(split.s) AS item, 
       CASE 
         WHEN ( split.pn = 1 ) THEN 1 
         ELSE 0 
       END            AS isdefault 
FROM   #table1 
       CROSS APPLY test.dbo.Split('|', items) AS split 

UPDATE #table1 
SET    defaulttypeid = t2.ID
FROM   #table1 t1 
       INNER JOIN #table2 t2 
         ON t1.id = t2.typeid 
            AND t2.isdefault = 1 


DROP TABLE #table1 

DROP TABLE #table2 

Это выводит

ID          Items                          DefaultTypeID
----------- ------------------------------ -------------
1           type|type1|type2|type3|type4    1     
2           type|type1|type2|type3|type4    6



ID          TypeID      Type  IsDefault
----------- ----------- ----- ---------
1           1           type  1
2           1           type1 0
3           1           type2 0
4           1           type3 0
5           1           type4 0
6           2           type  1
7           2           type1 0
8           2           type2 0
9           2           type3 0
10          2           type4 0
2 голосов
/ 18 мая 2011

Хотя я совершенно не согласен с использованием курсоров, я не могу придумать другого пути. Это решение не тестировалось, но, похоже, все должно быть в порядке.

DECLARE @pos INT
DECLARE @id INT
DECLARE @string VARCHAR(MAX)
DECLARE @default INT
DECLARE @substring VARCHAR(MAX)

DECLARE tempCursor CURSOR FOR
SELECT id, string
    FROM table_name

OPEN tempCursor;
FETCH NEXT FROM tempCursor
    INTO @id, @string

WHILE @@FETCH_STATUS = 0
BEGIN
SET @default = 1
SET @pos = CHARINDEX('|', @string)
WHILE (@pos <> 0)
BEGIN
    SET @substring = SUBSTRING(@string, 1, @pos - 1)
    INSERT INTO table_name2(typeid, type, default) VALUES (@id, @substring, @default)
    SET @string = substring(@string, @pos+1, LEN(@string))
    SET @pos = charindex('|', @string)
    SET @default = 0
END

FETCH NEXT FROM tempCursor
    INTO @id, @string
END

CLOSE EWSCursor;
DEALLOCATE EWSCursor;

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...