Помогите с 2 циклами и обновлением в SQL Server 2000 - PullRequest
0 голосов
/ 25 августа 2011

Я работаю над хранимой процедурой, которая будет запускаться один раз в неделю, поэтому я не беспокоюсь о скорости, а заставляю ее работать.

То, что я пытаюсь сделать, - это перебрать таблицу под названием households, в которой хранится информация о домах, а затем использовать houseid, перебирая таблицу под названием individuals, которая вернет более одного человека, поэтому приводит меня к переберите этот результат для сбора информации.

Моя главная цель - объединить все имена людей в домашнем хозяйстве и их коды

declare @RowNum int,
    @houseId nchar(10), 
    @hid nchar(25) 

    select @houseId=MAX(ID) FROM households     --start with the highest ID 
    Select @RowNum = Count(*) From households      --get total number of records
    WHILE @RowNum > 0                          --loop until no more records BEGIN       

    select @hid = id from households where ID = @houseid    --get other info from that row  

    DECLARE @RowCount INT

    SET @RowCount = (SELECT COUNT(ID) FROM (select id, firstname,lastname,party_code from indviduals where householdid = @houseid) as table1)  
    DECLARE @code1 VARCHAR(50), @names1 VARCHAR(500), @lastname1 VARCHAR(50) 
    -- Declare an iterator
    DECLARE @I INT
    -- Initialize the iterator
    SET @I = (select min(id) from indviduals where householdid = @houseid)

    -- Loop through the rows of a table @myTable
    WHILE (@I <= @RowCount)
    BEGIN
            -- Declare variables to hold the data which we get after looping each record 
            DECLARE @code VARCHAR(50), @names VARCHAR(500), @lastname VARCHAR(50)    

            -- Get the data from table and set to variables
            SELECT @code = party_code, @names = firstname, @lastname = lastname FROM (select id, firstname,lastname,party_code from indviduals where householdid = @houseid) as table1  WHERE ID = @I
            -- Display the looped data



    set @code1 = (@code + ',' + @code1)
    set @names1 = (@names + ',' + @names1)
    set @lastname1 = @lastname
            -- Increment the iterator
            SET @I = @I  + 1
    END

    update households    
    SET firstnames=@names1, lastname=@lastname1, party_codes=@code1,
    where id = @houseid  

    select top 1 @houseId=ID 
    from households
    where ID < @houseID 
    order by ID desc --get the next one    

     set @RowNum = @RowNum - 1                              
     END 


household table
    1 bekshire st   dell    MA  10001   02639   50  0002    dell    NULL    ALRGEN  1   BERKSHIRE ST    NULL    NULL    NULL    NULL

individuals that belong to household id 10001
first    last     code
BOB BUILDER     U
JESS     BUILDER  A

i want 

1 bekshire st   dell    MA  10001   02639   50  0002    dell    NULL    ALRGEN  1   BERKSHIRE ST    BOB,JESS    BUILDER U,A 

1 Ответ

1 голос
/ 25 августа 2011

Если вам нужно объединить данные, чтобы поместить их в таблицу, значит, ваш дизайн неправильный. Пожалуйста, прочитайте о нормализации. Объединенный список не должен храниться в поле. Каждое поле в каждой строке данных должно содержать не более 1 фрагмента информации. Что вам нужно, это связанные таблицы.

...