Update SQL table with random value from other table

后端 未结 6 1789
挽巷
挽巷 2020-12-31 06:56

On Microsoft SQL Server 2008, I have a table with Products:

Id | Name | DefaultImageId

And one with Images:

Id | ProductId |

相关标签:
6条回答
  • 2020-12-31 07:39

    Addressing @philreed's issue with the selected answer:

    Is there a way to assign each row being updated with a different value randomly chosen from the source table?

    UPDATE Products
    SET DefaultImageId = t2.Id
    FROM Products t1
    CROSS APPLY (
        SELECT TOP 1 Id
        FROM Images
        WHERE t1.Id = t1.Id
        ORDER BY newid()
        ) t2    
    
    0 讨论(0)
  • 2020-12-31 07:40
    declare @carg_id as int
    DECLARE cursor_cargo CURSOR FOR 
        SELECT carg_id FROM cargo
    
    OPEN cursor_cargo
    
    FETCH NEXT FROM cursor_cargo
    INTO @carg_id
    WHILE  @@FETCH_STATUS =0
    BEGIN
    
        update cargo set ciud_id = (
        select top 1 ciud_id from ciudad 
        inner join Pais on Pais.pais_id = ciudad.pais_id
        where ciudad.pais_id is not null and empr_id is  null and pais_status =1 order by  NEWID()) WHERE CARG_ID = @CARG_ID
    
        FETCH NEXT FROM cursor_cargo
            INTO @carg_id
    END
    CLOSE cursor_cargo
    DEALLOCATE cursor_cargo
    
    0 讨论(0)
  • 2020-12-31 07:42

    Check this out.

    Update Products
    Set DefaultImageId = (
    SELECT top 1 Id 
    From Images 
    Where 1=1
    and Products.Id = Images.ProductId
    ORDER BY NEWID()
    )
    
    0 讨论(0)
  • 2020-12-31 07:44

    Another possible solution

    UPDATE
        Products
    SET
        DefaultImageId =
        (
            SELECT TOP 1
                Id
            FROM
                Images
            ORDER BY
                NEWID(), Products.Id
        )
    
    0 讨论(0)
  • 2020-12-31 07:45

    You can do an order by on a NEWID to get a random number for every row of your update.

    UPDATE
        Products
    SET
        DefaultImageId =
        (
            SELECT TOP 1
                Id
            FROM
                Images
            WHERE
                Images.ProductId = Products.Id
            ORDER BY
                NEWID()
        )
    

    This has been down marked and comments added indicating it does not solve the problem. I think the confusion has come from where people have not realised the original question requests a random image be selected for each product, hence the where clause with Product Id. Have provided a full script with data set below. It adds five products and three images for each product. Then randomly sets the default image id for each product.

    CREATE TABLE Products(Id INT, Name NVARCHAR(100), DefaultImageId INT NULL)
    
    CREATE TABLE Images (Id INT, ProductId INT, Bytes VARBINARY(100))
    
    INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(1, 'A', NULL)
    INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(2, 'B', NULL)
    INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(3, 'C', NULL)
    INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(4, 'D', NULL)
    INSERT INTO Products (Id, NAME, DefaultImageId) VALUES(5, 'E', NULL)
    
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(1, 1, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(2, 1, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(3, 1, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(4, 2, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(5, 2, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(6, 2, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(7, 3, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(8, 3, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(9, 3, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(10, 4, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(11, 4, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(12, 4, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(13, 5, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(14, 5, NULL)
    INSERT INTO Images (Id, ProductId, Bytes) VALUES(15, 5, NULL)
    
    UPDATE
        Products
    SET
        DefaultImageId =
        (
            SELECT TOP 1
                Id
            FROM
                Images
            WHERE
                Images.ProductId = Products.Id
            ORDER BY
                NEWID()
        )
    
    SELECT * FROM Products
    
    0 讨论(0)
  • 2020-12-31 07:50

    Try this one (on AdventureWorks):

    It updates all rows of the person table with a new random name from the product table.

    begin tran
    --show initial state:
    select top 25 * from person.person order by BusinessEntityID
    
    update person.person
    set 
    FirstName = otherTable.Name
    from 
    (select BusinessEntityID, row_number() over (order by newid()) as row_num from person.person) p2
    ,(select ProductId, Name, row_number() over (order by newid()) as row_num from production.product) as otherTable
    where 
    person.person.BusinessEntityID=p2.BusinessEntityID 
    and (p2.row_num%500)=(otherTable.row_num%500) -- deal with tables with different rowcount
    
    --check results:
    select top 25 * from person.person order by BusinessEntityID
    
    rollback tran
    

    Or try a similar query on SQL Fiddle: http://sqlfiddle.com/#!3/8b719/1

    0 讨论(0)
提交回复
热议问题