首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server 1:N 關聯表隨機抽取一條記錄的 SQL 寫法

     編輯:程式設計綜合問答

需求

表 A (歌手出現多行) 關聯表 B (歌手所有歌曲),為 A 每行隨機填充 B 中該歌手的一首歌。

通用寫法

UPDATE a
SET a.SongName = b.SongName
FROM tb1 a
CROSS APPLY (
    SELECT TOP 1 SongName
    FROM tb2
    WHERE Singer = a.Singer
    ORDER BY NEWID() -- 隨機
) b;

解析

  • CROSS APPLY 為 A 每行執行子查詢,返回單行結果。
  • ORDER BY NEWID() 實現隨機 (SQL Server 特有)。
  • MySQL/PostgreSQL 用 ORDER BY RAND() / ORDER BY RANDOM()。

大數據優化

若 B 表極大,NEWID() 全表掃描慢。可預先為 B 表添加 RandomKey 列 (隨機浮點數),建立索引,查詢時 WHERE RandomKey > RAND() ORDER BY RandomKey LIMIT 1。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved