当前位置:首页 » 编程语言 » 复杂sql很难理解
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

复杂sql很难理解

发布时间: 2022-08-09 03:03:08

A. 小弟刚学sql就遇到一条语句,难以理解,求各位大侠给解析!

首先,你这个sql写的有问题,我先给你解释下这个sql吧
这其实就是一个分组查询语句
group by 是分组,它是按照你的node.name来进行分组,order by是排序
按照你的node.lft来进行排序。select后面跟的是你想要查询的数据,from后是表名,
表名后使用as是给表使用一个简短的别名,count()是统计你的parent.name的总和,,
(COUNT(parent.name)-1)AS level,这个的意思是计算出parent.name的总和减去一,
使用一个level这个字段来代表所查询出来的数据
但像你那样写肯定是执行不下去的。这是我修改后的sql
SELECT node.account_id,node.name,node.acc_num,node.debit,node.credit,node.balance,(COUNT(parent.name)-1)AS level,
node.lft,node.rgt
FROM accounts AS node,accounts AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.account_id,node.name,node.acc_num,node.debit,node.credit,node.balance,node.lft,node.rgt
ORDER BY node.lft;
如有疑问,请联系我

B. 这个sql语句有点复杂,高手帮我解释一下

case 表达式A when 表达式B then 表达式C else 表达式D end
当 表达式A 等于 表达式B 返回 表达式C 的值,否则返回 表达式D 的值
我查过了,表达式A 的确可以没有
没有的情况下,表达式B 布尔为真时返回 表达式C 的值,否则返回 表达式D 的值

left,right 是从左/右返回字符串内容的函数

本 SQL 返回
wttype 中的 id,typename,id 最后两位是'00'时返回 '' 否则返回 wttype 中 id 开始的两位等于 @ttype 参数开始的两位并且 id 的最后两位为 '00' 的 typename,id 的左边两位加 '00' 别名为 uptypedid 条件为 id=@ttype

可看出,这是一个分类名称表
id是一个4字符长度的编号,前两位是大类,后两位是小类,后两位为 "00" 时此数据行的 typename 就是大类名称,否则 typename 就是小类名称
本例子通过参数 @ttype 分类编号
返回 id 类编号, typename 分类名称, 父分类名称,大类编号

C. 一个巨复杂,理解不了的sql怎么写

create table MM_DATATITLE
(
DataCode VARCHAR(25) not null,
Row INTEGER not null,
TitleVal VARCHAR(60),
TitleType CHAR(1),
constraint P_Key_1 primary key ( DataCode , Row )
)
in TBS1
index in TBS_IDX;

create table MM_DATAVALUE
(
DataCode VARCHAR(25) not null,
Col INTEGER not null,
Row INTEGER not null,
DataVal VARCHAR(60),
constraint P_Key_1 primary key ( DataCode , Col , Row )
)
in TBS1
index in TBS_IDX;

D. 刚学sql数据库就怎么那么复杂的例子看不懂求大神解释

请参阅下面的文章,主要是讲述如何使用命令创建数据库,

在sql命令有指定文件路径 文件组 大小

使用sql脚本创建数据库

如果有疑问,请及时沟通

请采纳!

E. sql刚刚接触存储过程,怎么这么难啊,看都看不懂,干什么的都不知道!有没有什么办法啊

其实存储过程就是把一系列的sql写在了一起,你可以分割开,拿出来一步步执行就明白了

F. 怎么学SQL 简单些 那些英文太复杂了

那不是英文 就是硬编码
多写几个sql语句就理解了。
建议学习的时候可以建一个字段少的,记录少的表。体验一下关键字的作用
复习的时候弄个大表字段多的表关联多的表,多个关键字配合起来用。
因为你只在单个表上用单个关键字是理解不到有用的东西的

G. SQL触发器中难理解的问题,害怕滴很。求救

由于 SQL Server 的触发器, 是 语句级别的。 不是 逐行触发的。

例如你执行
Update STUDENTS SET Name=Name+'_TRG'

假设更新了 10 行数据。

对于 语句级别的 触发器, 那么就执行一次。
而对于 逐行触发器, 那么就会执行 10次。 ( Oracle, DB2, MySQL 支持

FOR EACH ROW 的逐行触发器, SQL Server 不支持)

那么怎么解决你这个一次触发器, 处理 10行数据的问题呢?
在 SQL Server 里面, 这个 inserted 可以看成是一张 多行的表。

如果业务逻辑复杂, 那么你需要通过 游标来 依次处理。

如果业务逻辑比较简单, 例如仅仅是 记录一个日志信息。
那么, 通过 INSERT ... FROM inserted 的方式, 来完成插入多行数据的处理。

下面是一段简单的例子

IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
BEGIN
-- 插入触发.
-- 正确的使用.
INSERT INTO B
SELECT
inserted.aid,
inserted.money
FROM
inserted;

-- 不正确的使用.
SELECT @aid = aid, @money = money FROM inserted;
INSERT INTO C VALUES ( @aid, @money);
END;

H. 一段很复杂很复杂的SQL语句。。求大神解释。。。

Select
*
From
(
Select
*
From
(
Select
Number
,ChineseName
,tb1.DepartmentCode
,DepartmentName
,ShiftId
,ShiftName
,Degree
,AskForLeaveType
,WorkOnDate
,OnDutyType
,StartTime
,EndTime
,AOnDuty
,AOffDuty
,Allday
,tb1.SumTotal
,'Error'=
Case
WhenDegree=1ANDStartTime<=AOnDutyANDEndTime<=AOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=1ANDStartTime>=AOffDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=1ANDStartTime>=WorkOnDate+''+'12:30'ANDEndTime<=WorkOnDate+''+'13:30'ANDCharindex('常白班',ShiftName)>0ANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=2ANDStartTime<=AOnDutyANDEndTime<=AOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=2ANDStartTime>=AOffDutyANDEndTime<=BOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=2ANDStartTime>=BOffDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=3ANDStartTime<=AOnDutyANDEndTime<=AOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=3ANDStartTime>=AOffDutyANDEndTime<=BOnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=3ANDStartTime>=BOffDutyANDEndTime<=COnDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenDegree=3ANDStartTime>=COffDutyANDShiftId>0ANDLeft(AskForLeaveType,1)='0'Then0
WhenShiftId=0ANDLeft(AskForLeaveType,1)='0'Then0
WhenShiftId>0ANDLeft(AskForLeaveType,1)<>'0'ANDLeft(OnDutyType,1)=0Then0
WhenShiftId>0ANDLeft(AskForLeaveType,1)<>'0'ANDLeft(OnDutyType,1)=2ANDAskForLeaveType='出差假'Then0
WhenShiftId>0ANDLeft(AskForLeaveType,1)<>'0'ANDLeft(OnDutyType,1)=2ANDAskForLeaveType='产假'Then0
WhenShiftId=0ANDLeft(AskForLeaveType,1)<>'0'ANDConvert(varchar(10),StartTime,108)='00:00:00'ANDConvert(varchar(10),EndTime,108)='00:30:00'Then0
Else
1
End
From
(
Select
Number
,ChineseName
,DepartmentName
,d.DepartmentCode
,p.ShiftId
,p.ShiftName
,Degree
,AskForLeaveType
,Convert(varchar(10),WorkOnDate,120)as'WorkOnDate'
,StartTime
,EndTime
,AllDay
,SumTotal
,CaseWhenRight(Convert(Varchar(10),WorkOnDate,120),5)IN(selectRight(Convert(Varchar(10),HolidayDate,120),5)FromAttendanceHoliday)THEN'2-公众假上班'ELSE'0-平时上班'ENDAS'OnDutyType'
,CaseWhenLeft(FristBrushDate,1)='1'ANDConvert(varchar(10),AOffDuty,120)>Convert(varchar(10),AOnDuty,120)ThenCAST(Convert(Varchar(11),Dateadd(dd,-1,OnDutyDate),120)+Convert(Varchar(5),AOnDuty,108)ASDateTime)ELSECAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),AOnDuty,108)ASDateTime)EndAS'AOnDuty'
,CaseWhenLeft(FristBrushDate,1)='0'ANDConvert(varchar(10),AOnDuty,120)<Convert(varchar(10),AOffDuty,120)ThenCAST(Convert(Varchar(11),Dateadd(dd,1,OnDutyDate),120)+Convert(Varchar(5),AOffDuty,108)ASDateTime)ELSECAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),AOffDuty,108)ASDateTime)EndAS'AOffDuty'
,CAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),BOnDuty,108)ASDateTime)AS'BOnDuty'
,CAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),BOffDuty,108)ASDateTime)AS'BOffDuty'
,CAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),COnDuty,108)ASDateTime)AS'COnDuty'
,CAST(Convert(Varchar(11),OnDutyDate,120)+Convert(Varchar(5),COffDuty,108)ASDateTime)AS'COffDuty'
From
.DepartmentCode=d.DepartmentCode
.Employeeid=a.Employeeid
INNERJOINAttendanceSpellpona.Employeeid=p.Employeeidanda.WorkOndate=p.OnDutyDate
LEFTJOINAttendanceShiftssonp.Shiftid=s.Shiftid
)tb1
)tb2WhereError=1

UNIONALL

Select
Number
,ChineseName
,DepartmentCode
,DepartmentName
,ShiftId
,ShiftName
,Degree
,AskForLeaveType
,WorkOnDate
,CaseWhenRight(Convert(Varchar(10),WorkOnDate,120),5)IN(selectRight(Convert(Varchar(10),HolidayDate,120),5)fromAttendanceHoliday)THEN'2-公众假上班'ELSE'0-平时上班'ENDAS'OnDutyType'
,StartTime
,EndTime
,AOnDuty
,AOffDuty
,Allday
,SumTotal
,Error
From
(
Select
Number
,ChineseName
,d.DepartmentCode
,DepartmentName
,p.ShiftId
,p.ShiftName
,Degree
,AskForLeaveType
,WorkOnDate
,StartTime
,EndTime
,Sumtotal
,NULLAS'AOnDuty'
,NULLAS'AOffDuty'
,AllDay
,1AS'Error'
From
AttendanceAskForLeavea
LEFTJOINEmployeeseONa.Employeeid=e.Employeeid
LEFTJOINDepartmentsdONe.DepartmentCode=d.DepartmentCode
LEFTJOINAttendanceSpellpONa.Employeeid=p.EmployeeidANDa.WorkOnDate=p.OnDutyDate
LEFTJOINAttendanceShiftssONp.ShiftId=s.ShiftId
Where
Left(IncumbencyStatus,1)<>1
Groupby
Number,ChineseName,d.DepartmentCode,DepartmentName,p.ShiftId,p.ShiftName,Degree,AskForLeaveType,AllDay,WorkOnDate,StartTime,EndTime,Sumtotal
having
Count(1)>1
)tb3
)tb4

对你的代码格式化后发现,还缺少一些语句,你是否粘贴完整了?

读完SQL语句后发现,其实是一个考勤核算的查询语句,是两个大的SQL查询Union ALL的结果

I. 一个十分复杂的sql语句,新手不要进

用以下语句吧::
select con,
REPLACE(content.con,
(select top 1 keyword from keywordfont where charindex(keyword,content.con,0) > 0 and charindex(@keyword,keyword,0) > 0
order by charindex(@keyword,keyword,0) asc
)
,'('+ ((select top 1 keyword from keywordfont where
charindex(keyword,content.con,0) > 0 and charindex(@keyword,keyword,0) > 0
order by charindex(@keyword,keyword,0) asc
)) + ')' )
from content
where con like '%' +@keyword + '%' and
exists(select 1 keyword from keywordfont where charindex(keyword,content.con,0) > 0 and charindex(@keyword,keyword,0) > 0)

J. 大家说怎么才能学好 sql 我看着查询根本看不懂啊 能看懂的时候但是自己想不出来

大段复杂的SQL都是用最基本的select where 语句拼成的,你可以把无关的内容先去掉,就能看出最基本的框架,知道主要是干什么
然后这些语句里面会有很多union left join in 之类的以及一些转换函数
你要一点点学习select基本句式和扩展句式,以及这些连接词都是有什么作用
再回想这个语句的基本任务,通过一段时间的学习,就能越来越明白了
没有什么捷径,所谓的捷径,就是牢固掌握最基本的语法和各种用法。
任何高深的语句都是这些基本元素堆砌的