VOL_常用记录!!-----后端


一、sql记录

触发器参照编写

CREATE TRIGGER trgAfterInsert_UpdateUDFs
ON YourTargetTable
AFTER INSERT
AS
BEGIN
    -- 禁用触发器的行为以避免递归触发
    SET NOCOUNT ON;

    -- 更新目标表中的 UDF004 和 UDF005 字段
    UPDATE t
    SET 
        UDF004 = b.ProductName,
        UDF005 = b.ProductStandard
    FROM YourTargetTable t
    INNER JOIN inserted i ON t.ID = i.ID
    INNER JOIN Base_Product b ON i.MatCode = b.ProductCode
    WHERE i.REGRULE = 'MatRegSN';
END;

创建聚集索引(NCLUSTERED用于分组排序)或非聚集索引(NONCLUSTERED)

CREATE NONCLUSTERED INDEX IX_FIT_METER_INFO_SERIAL_NO_DESC
ON FIT_METER_INFO (SERIAL_NO DESC) 

两表中相同的项目名称来更新 Table1 中的项目编号

UPDATE Table1
SET Table1.ProjectNumber = Table2.NewProjectNumber
FROM Table1
INNER JOIN Table2 ON Table1.ProjectName = Table2.ProjectName;

标识列不能插入显示值

在这里插入图片描述

-- 将IDENTITY_INSERT设置为ON
SET IDENTITY_INSERT Sys_Role ON
INSERT INTO Sys_Role (id, column2, column3) 
VALUES (123, 'value2', 'value3')
SET IDENTITY_INSERT Sys_Role OFF
-- 插入完成后,记得将IDENTITY_INSERT设置回OFF

sqlserver表添加列和注释

ALTER TABLE [dbo].[要添加的表名] ADD [ModifyDate] 数据类型  NULL
GO

EXEC sp_addextendedproperty
'MS_Description', N'要添加的注释',
'SCHEMA', N'dbo',
'TABLE', N'要添加的表名',
'COLUMN', N'ModifyDate'

Sqlserver/唯一查询Distinct失效

WITH temp AS (
    SELECT
        '01' AS vouchertype,
        td.DOC_NO AS cordercode,
        t.UDF001 AS cwhcode,
        t.CreateDate AS ddate,
        t.ID AS ccode,
        t.SUPPLIER_CODE AS cvencode,
        0 AS states,
        t.CreateDate,
        t.DOC_NO AS mes_code,
        ROW_NUMBER() OVER (PARTITION BY t.ID ORDER BY t.CreateDate) AS rn
    FROM
        T_ToERP_Main t
    INNER JOIN T_ToERP_MBody td ON t.Id = td.ID
    WHERE XTYPE = 'purchase' AND AuditState = 'N' AND CreateDate > '2024-12-08 15:06:00'
)
SELECT * FROM temp WHERE rn = 1;--保留排序出的第一条记录

Sqlserver/Mysql用表标识列删除重复项

  • Mysql用表标识列删除重复项
  • 想基于某列(或几列)的值来决定保留哪一行(比如总是保留ID最小的那一行)
DELETE t1 FROM your_table t1
JOIN (
    SELECT MIN(id) as min_id, column_with_duplicates
    FROM your_table
    GROUP BY column_with_duplicates
    HAVING COUNT(*) > 1
) t2 ON t1.column_with_duplicates = t2.column_with_duplicates AND t1.id <> t2.min_id;
  • sqlserver用表标识列删除重复项
  • 对于支持窗口函数的数据库系统(如SQL Server、PostgreSQL、Oracle等)
  • 可以使用 ROW_NUMBER() 分配每个重复记录的行号,然后删除行号大于1的记录。
WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY column_with_duplicates ORDER BY id) as rn
    FROM your_table
)
SELECT * FROM CTE WHERE rn > 1; -- 查询要删除的
DELETE FROM CTE WHERE rn > 1;--保留第一个

case条件逻辑控制结构

  • 常用于翻译字段不同的结果
CASE case_value
	WHEN when_value THEN statement_list
	ELSE statement_list
END as 别名

sql常用函数记录

-- 当天时间范围条件
CONVERT(DATE, GETDATE()) 
AND DATEADD(SECOND, -1, DATEADD(DAY, 1, CONVERT(DATE, GETDATE())));
-- 格式化时间
format(CONVERT ( datetime, BIDDING_TIME, 120 ),'yyyy-MM-dd HH:mm:ss')
-- 获取当前系统时间并格式转换  '2024-03-06 09:20:04'
CONVERT ( VARCHAR ( 19 ), GETDATE( ), 120 )
-- 时间转换  '11 12 2022 7:08PM' -> ''2024-03-06 09:20:04''
CONVERT(varchar(19), TRY_CONVERT(datetime, 字段名, 100), 120)
-- 时间转换  去除毫秒
CONVERT(VARCHAR(19), 字段名, 120)
-- cast显式转换数据类型将guid转换成字符串
'JBWC' + CAST ( newid( ) AS VARCHAR ( 50 ) ) AS NOTICE_NO,
-- 截取字符段长度
SUBSTRING(截取的字段, 开始索引(1开始), length)
-- replace替换字符串中的某一子串的
REPLACE(str, search_string, replacement_string)

sql备份表

在SQL中,如果你想从一个表(比如原表)创建一个内容完全一样的新表(比如原表_copy

  • 在SQL Server、PostgreSQL等数据库,可以使用SELECT INTO语句。以下是具体的SQL命令:
SELECT * INTO dawd_copy FROM dawd;
  • 在MySQL中则需要采用CREATE TABLE AS SELECT的方式:
CREATE TABLE dawd_copy AS SELECT * FROM dawd;

sql批量插入数据

从Base_Advice_PrefixCode表里面查出字段然后批量插入到Sys_QuartzOptions这里面

INSERT INTO Sys_QuartzOptions(Id,TaskName,GroupName,CronExpression,Method,ApiUrl,Status,TimeOut) 
SELECT newid(),Business_Type+ '-' + Table_Name,SUBSTRING(Business_Type, 1, 4),'0 0/1 * * * ?','post'
,'http://localhost:9991/api/Sys_PostDataLog/SendNqiData?tableName=' + Table_Encoding,'1','180'
 FROM Base_Advice_PrefixCode

sql–NOT EXISTS

  • 一般用于自查
not exists(select 1 from Base_Product where Base_Product.ProductCode=v_RD_PRODUCT_INFO.PRODUCT_CODE)

NOT EXISTS 是 SQL 中的一个条件表达式,主要用于在子查询中执行一个谓词测试,以判断是否存在满足特定条件的行。它常常用于在主查询中排除与子查询结果相关的记录。

在 SQL 查询中,NOT EXISTS 结构的一般语法是这样的:

SELECT ...
FROM table1
WHERE NOT EXISTS (
    SELECT 1
    FROM table2
    WHERE condition
)
  • 主查询(外部查询):table1 中的记录是我们关注的目标集合。
  • 子查询(内部查询):table2 和其中的 condition 定义了一个子集,用于检查是否存在符合条件的行。
    select 1 的意思是选取一个常量值1,这里并不是指具体的某个列,而是用来构造一个布尔表达式。
    NOT EXISTS 的工作原理是,对于主查询中的每一行,它都会去检查子查询是否存在满足 condition 的记录。如果有哪怕一行满足条件,EXISTS 就会返回 TRUE,反之则返回 FALSE。加上 NOT 后,如果子查询没有找到匹配的记录,则 NOT EXISTS 返回 TRUE,主查询中对应的那行记录就会被保留下来。

举个例子:

SELECT * 
FROM Orders o
WHERE NOT EXISTS (
    SELECT 1
    FROM OrderDetails od
    WHERE od.OrderID = o.OrderID AND od.ProductID = 100
)

这个查询会返回所有在 Orders 表中但不在 OrderDetails 表中有产品ID为100的相关订单记录。

总结一下,NOT EXISTS 关键字主要用于从主查询结果集中过滤掉那些在相关子查询中能找到匹配记录的行。

sql-----case-when-else-end

  • 条件case关联同时显示列也要有case..end
SELECT
    CASE 
        WHEN RIGHT(PLAN_CODE, CHARINDEX('-', REVERSE(PLAN_CODE)) - 1) = '001' THEN 'PCB板工序' 
        WHEN RIGHT(PLAN_CODE, CHARINDEX('-', REVERSE(PLAN_CODE)) - 1) =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值