Using subquery to pull random value reveals same value every time

You could try

SELECT T1.column1,
    (SELECT TOP 1 column1 as c2 FROM Table2 ORDER BY NewID(), LEN(T1.column1))
FROM Table1 T1

To force it to re-evaluate the selection each time. This will be very inefficient though. Also quite fragile (without the LEN it didn't work!) Would it meet your requirement to sort the T2 values randomly once (or possibly more if Table1 is larger than Table2) then join by row_number?

The main difference I can see with the methods is that your current method will allow the same random row to be selected multiple times my proposed method wouldn't.


Try:

SELECT column1,
    (SELECT TOP 1 column1 as c2 FROM Table2 WHERE Table1.column1 IS NOT NULL ORDER BY NewID())
FROM Table1