【发布时间】:2017-10-16 02:40:20
【问题描述】:
我正在解决这个问题:How can I randomly do a partial outer join in SQL 最后没用,因为可以多次分配同一行。
但是我有一种行为,我无法解释查询在哪里没有返回预期的行数
WITH tableA as (
SELECT T.id
FROM ( VALUES (111), (222), (333), (444), (555) ) T(id)
), tableB as (
SELECT *, row_number() over (order by note) as rn
FROM ( VALUES ('a'), ('b'), ('c'), ('d'), ('e'),
('f'), ('g'), ('h'), ('i'), ('j'),
('k'), ('l'), ('m'), ('n'), ('o')
) T(note)
), parameter as (
SELECT 3 as row_limit, (SELECT MAX(rn) FROM tableB) as max_limit
), Nums AS (
SELECT n = ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects
), random_id as (
SELECT tableA.*, T.n, floor(p.max_limit * RAND(convert(varbinary, newid()))) + 1 magic_number
FROM tableA
CROSS JOIN parameter p
CROSS JOIN (SELECT n
FROM Nums
CROSS JOIN parameter p
WHERE n <= p.row_limit ) T
)
-- SELECT * FROM random_id
SELECT R.*, note
FROM random_id R
JOIN tableB
ON R.magic_number = tableB.rn
ORDER BY id
- 设置:
tableA5 行,tableB15 行。表 A 中每一行的 3 个随机tableB行。所以总共应该返回 3 * 5 = 15 行 - 我创建了一个从 1 到 15 的
row_number()以匹配幻数 -
创建
random_idcte 为tableA 的每一行分配三个随机数。在这里你可以看到15行有一个随机数,同样显示两次分配相同值时的问题SELECT * FROM random_id; -
但
JOIN返回随机数的行。大于和小于 15SELECT R.*, note FROM random_id R JOIN tableB ON R.magic_number = tableB.rn ORDER BY id 但是如果我使用
LEFT JOIN总是返回 15 行。
问题:如果random_id cte 总是返回 15 行,JOIN 如何返回更多行,以及如果所有 rn 值都在 tableB 中,如何返回更少。
以及LEFT JOIN 如何总是返回 15 行。
我只是测试另一个查询,其中包含 n 值和 JOIN
【问题讨论】:
-
这里有类似的情况,Paul White 做了很好的解释:dba.stackexchange.com/a/30348/43889
标签: sql sql-server join random