zoukankan      html  css  js  c++  java
  • 如何删除表中的重复记录?等等常用SQL语句的积累

    1.如何删除表中的重复记录?(这里指记录的每个字段都要相同)
    select distinct * into #temp from tab
    delete tab
    insert tab select * from #temp
    drop table #temp

    1.DISTINCT 是 SUM、AVG 和 COUNT 的可选关键字。如果使用 DISTINCT,那么在计算总和、平均值或计数之前,先消除重复的值。

    如果使用 DISTINCT 关键字,表达式必须只包含列名。而不能包含算术表达式。

    以下查询返回商务书籍的平均价格(不包括重复的值):

    USE pubs
    SELECT AVG(DISTINCT price)
    FROM titles
    WHERE type = 'business'

    2.DISTINCT 关键字可从 SELECT 语句的结果中除去重复的行,distinct 后面的字段可以是多个或*,是一个那就各军兵种那个字段来取不重复的,
    如果是多个,那就是筛选所选的字短都相同的记录.
    USE pubs
    SELECT DISTINCT au_id--按照一个字段筛选
    FROM titleauthor

    USE pubs
    SELECT DISTINCT au_id,au_name --按照两个字段筛选
    FROM titleauthor


    2.怎样返回数据库中用户表的表单名
    select name from sysobjects where xtype='U'  
    select name from sysobjects where xtype = 'u' and status >=0

    3.
    http://community.csdn.net/Expert/topic/4191/4191899.xml?temp=.5814325
    各位大大请帮个忙,
    一个表中A字段是int型的自动编号,B字段是首先要获取A字段已有的自动编号数据再经过加入时间等后生成的数据,表如下
    C,D(日期),E为其他数据
    列名 A(自动递加)    B(A字段数据+日期等)   C   D   E
    ---------------------------------------------------
             1                 A+D            .   .   .
             2                 A+D            .   .   .


    ---- 建立测试环境:
    create table table1(a int identity,b varchar(20),c datetime,d datetime,e int)


    create proc proc1
    @c datetime,
    @d datetime,
    @e int
    as
    declare @f int
    insert table1 (c,d,e) values(@c,@d,@e)
    select @f=@@identity
    if @@error=0
    begin
    update table1 set b=convert(varchar,a)+convert(varchar(12),d,120) where a=@f
    end

    ---执行存储过程
    exec proc1 '2001-10-01','2001-10-20',45

    select * from table1

    4.事务问题
    http://community.csdn.net/Expert/topic/4245/4245634.xml?temp=.663891

    (1)try:
    -------------------------------------------------------------------------
    CREATE PROCEDURE sp_Order_UpdateOrderFormHeadByAffirm
    @OrderFormHeadID int,
    @AffirmPerson nvarchar(50)
    AS
    BEGIN TRANSACTION
        DECLARE @OrderFormNo nvarchar(50), @FranchiserNo nvarchar(10), @TotalSum decimal(18,4)

        --更新状态为确认
        UPDATE
            AD_U_HEAD_A_SSGL
        SET
            Tag = 1
        WHERE
            OrderFormHeadID = @OrderFormHeadID
       
        IF (@@error <> 0)
        BEGIN
            ROLLBACK TRANSACTION
            RETURN
        END


    ------------------------------------------------------------------------------------------

        --返回 订单管理(HEAD)的一些信息
        SELECT
            @OrderFormNo = OrderFormNo,
            @FranchiserNo = FranchiserNo,
            @TotalSum = TotalSum
        FROM
            AD_U_HEAD_A_SSGL
        WHERE
            OrderFormHeadID = @OrderFormHeadID
       
        IF (@@error <> 0)
        BEGIN
            ROLLBACK TRANSACTION
            RETURN
        END
    ------------------------------------------------------------------------------------------

        --更新 订单管理(DATA)
        UPDATE
            AD_U_DATA_A_SSGL
        SET
            Tag = 1,
            AffirmPerson = @AffirmPerson,
            AffirmDate = GETDATE()
        WHERE
            OrderFormNo = @OrderFormNo
           
        IF (@@error <> 0)
        BEGIN
            ROLLBACK TRANSACTION
            RETURN
        END
    ------------------------------------------------------------------------------------------

        --经销代理资信余额(MAIN)
        EXEC sp_Order_UpdateCreditBalance @FranchiserNo, 0, 0, 0, @TotalSum, 0
       
        IF (@@error <> 0)
        BEGIN
            ROLLBACK TRANSACTION
            RETURN
        END
    ------------------------------------------------------------------------------------------
        --新增 订单确认日志(SLOG)
        INSERT INTO
            AD_U_SLOG_A_DDQR(OrderFormNo, GoodsNo, Quantity,
            UnitPrice, ProductPackingNo,TotalQuantity, TotalSum, Rebate, FactSum)
        SELECT
            OrderFormNo, GoodsNo, Quantity, UnitPrice, ProductPackingNo,
            TotalQuantity, TotalSum, Rebate, FactSum
        FROM
            AD_U_DATA_A_SSGL
        WHERE
            OrderFormNo = @OrderFormNo
       
        IF (@@error <> 0)
        BEGIN
            ROLLBACK TRANSACTION
            RETURN
        END

        COMMIT TRANSACTION
    GO
    (2)----------------------------------
    CREATE PROCEDURE sp_Order_UpdateOrderFormHeadByAffirm
    @OrderFormHeadID int,
    @AffirmPerson nvarchar(50)
    AS
    SET XACT_ABORT ON
    BEGIN TRANSACTION
    ......

    (3)你说得没错 其实你那样用事务的画没什么作用,每个存储过程都是一个事务。如果用事务最好有出错的处理是否回滚之类的东西。但是要考虑好表之间的关联性,如果都是一些单独的表,可以分几个事务处理,如果是父子表还是要放在一个事务里面。保证其数据的准确
    性。
    4请给条如何找出重复记录的SQL语句

    select id,name,parentDeptid,status as state,type,showindex,url,corpid = 1001
    from zfj_dept

    日期:
    select convert(varchar(16),getDate(),120)   2005-11-18 10:20
    select convert(varchar,datepart(minute,getdate())) 获得分钟且转换为字符型

    内联结/外联结
    --返回两个表中共有的所有记录
    select *
    from testTable as a
    inner join TestTableChild as b on a.id = b.parentid

    --返回(左表)TestTable所有记录
    select *
    from testTable as a
    left outer join TestTableChild as b on a.id = b.parentid

    --返回(右表)TestTableChild的所有记录
    select *
    from testTable as a
    right outer join TestTableChild as b on a.id = b.parentid

    --- 返回 两个表里共有的记录,且不重复
    select a.id,a.name,b.name
    from testTable as a
    inner join TestTableChild as b on a.id = b.parentid
    group by a.id,a.name,b.name

    --返回(左表)TestTable所有记录
    select a.id,a.name,b.name
    from testTable as a
    left outer join TestTableChild as b on a.id = b.parentid
    group by a.id,a.name,b.name


    --------
    select a.id,a.subject,b.contentType,c.AuguryUp,c.AuguryDown,
    case c.type when '1' then '爱情' when '2' then '财运' when '3' then '事业' end as type

    from MMS_Content as a
    left outer Join MMS_ContentChild as b on a.id = b.parentid
    left outer join AuguryList as c on a.id = c.parentid

    where a.dept = 6
    group by a.id,a.subject,b.contentType,c.AuguryUp,c.augurydown,c.type

    向一个表A中插入记录,并且插入的记录在A中不存在(通过一个字段来判断)
    insert into trace_users (tracekey,muteSMS,CreateTime,traceuser,tracetime,traceSlot,traceduration)

    select 'TRACE_TIMER',0,getdate(),mobileid,getdate(),'30','0'
         from Epm_EmployeeList where corpid = 10001
                  and mobileid not in (select traceuser from trace_users )
                  and mobileid like '13%' and len(mobileid) = 11

    下面的要好些(not exists)

    insert into trace_users (tracekey,muteSMS,CreateTime,traceuser,tracetime,traceSlot,traceduration)

    select 'TRACE_TIMER',0,getdate(),mobileid,getdate(),'30','0'
          
    from Epm_EmployeeList where corpid = 10001
                   
    and not exists (select traceuser from trace_users )
                   
    and mobileid like '13%' and len(mobileid) = 11


    cast 和convert DateAdd和DateDiff

    -- 调度设置的时候更新人员状态
    --
    EPM_EmployeeList 里的active = 1
    --
    trace_Timer 里的active = 1
    --
    trace_users 里的traceduration 清0
    --
    执行例子:exec up_SetSchedule 1001,'1009,1019'
    ALTER  proc up_SetSchedule
    --create proc up_SetSchedule
    @nCorpId int,
    @vchEmployeeIds varchar(8000),
    @TimeStart DateTime,
    @TimeEnd DateTime

    as
    declare @sql varchar(8000),@TraceSolt int
    SET XACT_ABORT ON --任何一部有问题是都会回滚事务
    BEGIN TRANSACTION --开始事务
    update EPM_EmployeeList set activeStatus = 0 where corpid = @nCorpId and activeStatus != 0
    if (@vchEmployeeIds !='')
      
    begin
      
    set @sql ='update EPM_EmployeeList set activeStatus = 1 where corpid= '+convert(varchar(10),@nCorpId)+ ' and id in ('+@vchEmployeeIds+')'
      
    exec (@sql)
      
    --更新Trace_timer
      set @sql ='update trace_Timer set activeStatus = 1 where corpid= '+convert(varchar(10),@nCorpId)+ ' and mobileid   in ('
      
    set @sql= @sql+'select mobileid from EPM_EmployeeList where id in ('+@vchEmployeeIds+'))'
      
    exec (@sql)
      
    select @TraceSolt = (select tracesolt from EPM_EnterpriseList where id = @nCorpId)
    (
    '+@vchEmployeeIds+'))'
       set @sql =
    'update trace_users set createTime ='''+cast(@timeStart as varchar)+''''
       set @sql= @sql+
    ',traceTime='''+cast(DateAdd(minute,@TraceSolt,@timeStart) as varchar )
       set @sql= @sql+
    ''',traceDuration ='''+convert(varchar,datediff(minute,@timeStart,@timeEnd))+''' where traceuser in ('
       set @sql= @sql+
    'select mobileid from EPM_EmployeeList where id in ('+@vchEmployeeIds+'))'
       exec (@sql)
       end
    COMMIT TRANSACTION --提交事务
    GO



    --导出企业根据大类别。四个表就晕了。。。。。。。

    --插入到临时表里
    select distinct (a.id),a.corpname,a.corplinkman,a.phonenumber,a.createtime,a.address
    ,(select distinct d.name
    from
    dz_subinfoDefine as c,
    dz_mainInfoDefine as d
    where c.maintype = d.maintype
    and c.subtype = b.infotype) as type

    into #table2

    from dz_corporation as a
    left join dz_information as b on a.id = b.corpid

    --插入到表里.需要两次是因为无法对类别(大类)进行排序
    select case when type IS NULL then '未知类别' else type end as 大类别,corpname as 名称 ,corplinkman as 联系人,phonenumber as 联系电话,address as 地址 ,createTime as 创建时间 into Table1 from #table2
    order by type
    ----删除临时表
    drop table #table2


    好的方法????找不到........可能是数据库设计的不好.

    通过另一个表来更新本表的记录.
    begin transaction
    update EPM_Employeelist set loginname =b.loginname,password= b.password
    from zfj_users as b
    where
    EPM_Employeelist.userid = b.userid
       and corpid = 10001
    rollback transaction

    在in子句中如何写变量的表达式问题

    declare @ids varchar(8000)
    set @ids = '14501,14502,14503'
    select * from table1 where  charindex(','+cast(id as varchar(20))+',',','+@ids+',')>0
  • 相关阅读:
    jquery 功能优化
    MySQL Group Replication集群部署,基于官方文档
    django-filter跨表过滤,区间过滤
    xadmin默认显示用户名,密码,确认密码,添加字段
    函数的装饰器修复技术(@wraps)
    redis的特点总结-安装及基本命令的使用
    前后台分离时-后台处理跨域
    djangorestframework-jwt模块
    drf模块请求组件,响应组件,异常组件
    html 中画半圆的方法
  • 原文地址:https://www.cnblogs.com/yhb199/p/1233162.html
Copyright © 2011-2022 走看看