Random SQL Server中具有不同数量随机结果的随机联接

Random SQL Server中具有不同数量随机结果的随机联接,random,sql-server-2012,top-n,Random,Sql Server 2012,Top N,SQLServer的SQL变得非常聪明,看起来可能需要过程解决方案的事情通常可以用纯SQL来完成。我想知道这是不是其中的一次。 假设我们有一个州表和一个城市表 STATES: State: NY CITIES State: NY City: Armonk 现在让我们用第三张表来把事情复杂化:说明 INSTRUCTIONS State: NY HowMany: 17 State: NJ HowMany: 11 在SQL Server SQL中,当三个表按状态连接时,是否有任何方法可以从

SQLServer的SQL变得非常聪明,看起来可能需要过程解决方案的事情通常可以用纯SQL来完成。我想知道这是不是其中的一次。 假设我们有一个州表和一个城市表

STATES:
State:  NY

CITIES
State: NY
City:  Armonk
现在让我们用第三张表来把事情复杂化:说明

INSTRUCTIONS
State: NY
HowMany: 17

State: NJ
HowMany: 11
在SQL Server SQL中,当三个表按状态连接时,是否有任何方法可以从cities表中随机选择多少个城市

我们事先不知道前N名。它随状态而变化


当然,States表将包含所有50个州,Cities表包含每个州的所有城市,指令将包含每个州的一条记录,确定需要从该州随机选择多少个城市

p.S.假设NY的指令为HowMany=5,NJ的指令为HowMany=4,并按状态排序,则示例所需结果。状态:


与使用不使用DDL数据定义语言的查询的另一个答案不同

SET @row_num2= 0;
SELECT *,@row_num2 := @row_num2+1 as rownum2 FROM (SELECT States.State,Cities.City,Instructions.HowMany
from States,Cities, Instructions
WHERE States.State = Cities.State and States.State = Instructions.State
ORDER BY RAND()) as t HAVING rownum2 >= t.HowMany

与使用不使用DDL数据定义语言的查询的另一个答案不同

SET @row_num2= 0;
SELECT *,@row_num2 := @row_num2+1 as rownum2 FROM (SELECT States.State,Cities.City,Instructions.HowMany
from States,Cities, Instructions
WHERE States.State = Cities.State and States.State = Instructions.State
ORDER BY RAND()) as t HAVING rownum2 >= t.HowMany

我发现其他答案中使用的RAND函数由于不是每行的新随机数而导致了一些问题

在这个场景中,CHECKSUMNEWID对我很有效。看

我认为这个解决方案很好,很整洁:

SELECT
RandomCities.[State]
,[RandomCities].City
FROM
    (
        SELECT 
        s.[state]
        ,city
        ,ROW_NUMBER() OVER (PARTITION BY s.[State] ORDER BY CHECKSUM(NEWID())) AS [RandomOrder]
        FROM
        States s
        INNER JOIN Cities c ON c.[state]=s.[state]
    ) AS RandomCities
INNER JOIN instructions i ON i.[state]=RandomCities.[state]
WHERE RandomCities.RandomOrder<=i.HowMany

我发现其他答案中使用的RAND函数由于不是每行的新随机数而导致了一些问题

在这个场景中,CHECKSUMNEWID对我很有效。看

我认为这个解决方案很好,很整洁:

SELECT
RandomCities.[State]
,[RandomCities].City
FROM
    (
        SELECT 
        s.[state]
        ,city
        ,ROW_NUMBER() OVER (PARTITION BY s.[State] ORDER BY CHECKSUM(NEWID())) AS [RandomOrder]
        FROM
        States s
        INNER JOIN Cities c ON c.[state]=s.[state]
    ) AS RandomCities
INNER JOIN instructions i ON i.[state]=RandomCities.[state]
WHERE RandomCities.RandomOrder<=i.HowMany

你能发布一个想要的结果样本吗?说明中每个州都有一条记录,那么为什么要使用两个表呢?有多少可以从指令移到状态表中。@Kjetil S.同意,但此时无需重构。您能发布一个示例所需结果吗?指令每个状态有一条记录,那么为什么要使用两个表呢?可以将多少指令移到状态表中。@Kjetil S.同意,但此时无需重构。错误:ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML。错误:ORDER BY子句在视图中无效,内联函数、派生表、子查询和公共表表达式,除非还指定了TOP、OFFSET或FOR XML。