zoukankan      html  css  js  c++  java
  • 带附加条件的NewID()用法

    前天碰到一业务需求,难倒了团队成员,

    表结构如下:

    CREATE TABLE [dbo].[Product](
        
    [P_ID] [bigint] IDENTITY(1,1NOT NULL,
        
    [P_Name] [nvarchar](255NULL,
        
    [CategoryID1] [int] NULL,
        
    [CategoryID2] [int] NULL,

        [CategoryID3] [int] NULL,

          [P_SingleIntro] [nvarchar](200NULL,

        [LoginID] [nvarchar](50NULL,

     
    CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED 
    (
        
    [P_ID] ASC
    )

    需要随机列出表中每位用户(loginid)的一个产品,每次列出时随机值不重复。

    于是考虑用newid()

    select max(P_ID)as P_ID,loginID from product
    group by loginid order by NewID()

     结果每次取到的P_ID都是相同的! 不符合需求

    再修改如下:

    select P_ID,LoginID,P_Name,P_SingleIntro from product where P_ID in
    (
    select ( select top 1 p_id from product as b where b.loginid = c.loginid order by newid() ) as p_id 
    from ( select top 10000 a.loginID from product as a group by a.loginid order by NewID() ) as c 
    )
    --假定取前10000个用户

    OK!!!!(就是性能寒碜了点!^_^)

     感谢尘尘
    在SQL 2005/2008下可以这么做。

    代码
    select P_ID,LoginID,P_Name,P_SingleIntro 
    from (select P_ID,LoginID,P_Name,P_SingleIntro,
    ROW_NUMBER() 
    over(partition by loginID order by new) rn from (select *,NEWID() new from Product) as temp
    te 
    where rn=1 and LoginID is not null and Len(loginID)>0
    order by loginid  asc
    邀月注:本文版权由邀月和博客园共同所有,转载请注明出处。
    助人等于自助!  3w@live.cn
  • 相关阅读:
    Saltstack的部署及其详解
    SSH免密远程登陆及详解
    LVS-负载均衡集群部署
    nginx的平滑升级
    MFS分布式文件系统管理
    cacti监控部署与配置
    Nagios部署与配置
    zabbix分布式监控的部署与win被控端
    Fail2防止sshd暴力破解
    C# 发邮件
  • 原文地址:https://www.cnblogs.com/downmoon/p/1251730.html
Copyright © 2011-2022 走看看