听雨停了
码龄6年
  • 5,819
    被访问
  • 3
    原创
  • 1,792,989
    排名
  • 115
    粉丝
  • 0
    铁粉
关注
提问 私信

个人简介:我是一个神秘人!

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:江西省
  • 加入CSDN时间: 2016-12-26
博客简介:

qq_37170555的博客

查看详细资料
个人成就
  • 获得6次点赞
  • 内容获得0次评论
  • 获得6次收藏
创作历程
  • 3篇
    2017年
成就勋章
兴趣领域 设置
  • 数据库管理
    dba数据库开发
  • 最近
  • 文章
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

SQL优化不知道该如何描述

发布问题 2021.12.01 ·
2 回答

如何使MySQL关联查询返回结果集中相同字段不同数据 只返回一条

答:

列转行,然后在行转列就ok了。下面是sqlServer的代码,可以参考下。

--测试数据
use Tempdb
go
--> --> 听雨停了-->生成测试数据

if not object_id(N'Tempdb..#tabA') is null
    drop table #tabA
Go
Create table #tabA([id] int,[name] nvarchar(22))
Insert #tabA
select 1,N'张三'
Go
Select * from #tabA

use Tempdb
go
--> --> 听雨停了-->生成测试数据

if not object_id(N'Tempdb..#tabB') is null
    drop table #tabB
Go
Create table #tabB([id] int,[a_id] int,[yifu] nvarchar(22))
Insert #tabB
select 1,1,N'短袖' union all
select 2,1,N'长袖'
Go
Select * from #tabB
--测试数据结束

SELECT NAME,
       id_1,
       yifu_1,
       id_2,
       yifu_2
FROM   (
           SELECT NAME,
                  c + '_' + CONVERT(VARCHAR, rn) AS 'c',
                  v
           FROM   (
                      SELECT NAME,
                             CONVERT(VARCHAR(10), id) AS id,
                             CONVERT(VARCHAR(10), yifu) yifu,
                             ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY id) AS 
                             rn
                      FROM   (
                            SELECT a.name,b.id,b.yifu 
                            FROM #tabA AS a 
                            INNER JOIN #tabB AS b ON a.id=b.a_id    
                      )aa
                  ) a
                  UNPIVOT(v FOR c IN ([id], yifu)) u
       ) b
       PIVOT(MAX(v) FOR c IN (id_1, yifu_1, id_2, yifu_2)) p


NAME                   id_1       yifu_1     id_2       yifu_2
---------------------- ---------- ---------- ---------- ----------
张三                     1          短袖         2          长袖       
回答问题 2019.09.19

mysql delete 多条记录

答:
delete from table where parentId=10;
delete from table where id=10;

做两遍去删除试试看。

回答问题 2019.09.18

请问这个循环怎么理解鸭,为什么输出六个等于号

答:
for (m = 0; m <= n; m++)

这是你不够细心导致的。n最开始等于5,m最开始等于0,这个没问题吧。m<=n,也就是从0循环到5。0到5一共六个数字,不是五个数字。所以就是六个等号了

回答问题 2019.09.10

同一个sql中显示同一个字段的3个值,以第一个结果作为第二个结果的条件,第二个结果作为第三个结果的条件

答:

这样就可以了。

SELECT a.dictid,b.dictid,c.dictid FROM T AS a
INNER JOIN T AS b ON a.dictid=b.tid
INNER JOIN T AS c ON b.dictid=c.tid
WHERE a.tid='1010104030403'
回答问题 2019.09.04

请问各位有知道网址后面有个#null是怎么造成的吗

答:

刚看了下你的网站,请求的时候出现了Provisional headers are shown。具体原因你可以查一下。

回答问题 2019.09.04

sql server里的select属于DML还是DQL

答:

这个概念上的东西怎么来说呢,个人感觉了解就行,不必深究。一部分人说select是DQL,也有一部分说是DML。怎么来说呢,DQL是数据查询语言,说select是那是肯定的,DML是数据操纵语言,说select是在操作数据也不为过啊,查询也是对数据的一种操作啊

回答问题 2019.09.03

oracle如何查出连续上涨或连续下跌的股票数据

答:
--Sql Server脚本
;WITH ashareeodprice as
(
    select '1234567' as wind_code,'20160806' as trade_date,1.1 as s_dq_pctchange  union all
    select '1234567' as wind_code,'20160807' as trade_date,-1.2 as s_dq_pctchange  union all
    select '1234567' as wind_code,'20160808' as trade_date,-1.3 as s_dq_pctchange  union all
    select '1234567' as wind_code,'20160810' as trade_date,-1.1 as s_dq_pctchange  union all
    select '1234567' as wind_code,'20160811' as trade_date,-1.1 as s_dq_pctchange  union ALL
    select '1234567' as wind_code,'20160812' as trade_date,1.1 as s_dq_pctchange  union all
    select '444' as wind_code,'20160806' as trade_date,1.1 as s_dq_pctchange  union all
    select '444' as wind_code,'20160807' as trade_date,-1.1 as s_dq_pctchange  union all
    select '444' as wind_code,'20160808' as trade_date,-1.1 as s_dq_pctchange  
),cte AS (
    SELECT *,
        CASE  WHEN  s_dq_pctchange>0 THEN 1 ELSE 0 END AS col   --通过s_dq_pctchange正负数得到一个0/1的标识列
    FROM ashareeodprice
),cte2 AS (
    SELECT *,
        ROW_NUMBER() OVER(PARTITION BY wind_code ORDER BY trade_date) AS rn,    --根据wind_code分组,trade_date排序得到一个rn排序列
        ROW_NUMBER() OVER(PARTITION BY wind_code,col ORDER BY trade_date) AS rn2, --根据wind_code,col标识列分组,trade_date排序得到一个rn2排序列
        ROW_NUMBER() OVER(PARTITION BY wind_code ORDER BY trade_date) - ROW_NUMBER() OVER(PARTITION BY wind_code,col ORDER BY trade_date) AS cnt    --以上两列相减的结果列
    FROM cte
),cte3 AS (
    SELECT wind_code,
        cnt,
        CASE col WHEN 0 THEN '下跌' WHEN 1 THEN '上涨'  END [上涨/下跌],
        COUNT(cnt) [连续天数] 
    FROM cte2
    GROUP BY wind_code,cnt,col      --按wind_code,cnt,col分组
    HAVING count(cnt)>=2    --连续的天数【你的条件】
)
SELECT wind_code,[上涨/下跌],[连续天数] 
FROM cte3;

wind_code 上涨/下跌 连续天数
--------- ----- -----------
1234567   下跌    4
444       下跌    2

如果你的上涨/下跌是通过正负数来判断的话,上面的脚本和思路你可以参考下。是sql server的脚本,不是Oracle的。Oracle上应该直接运行不了的。

回答问题 2019.09.02

对象引用非静态的字段方法或属性“Form1.comboBox1.Text”是必需的,怎么解决

答:

静态方法中不能调用非静态字段或者属性的。你这样写是不行的。你可以把方法写成非静态的就行了

回答问题 2019.08.29

SQL 查询表所有数据,货品有重复的取日期较早的一条

答:
use Tempdb
go
if not object_id(N'Tempdb..#tab') is null
    drop table #tab
Go
Create table #tab([单号] nvarchar(24),[日期] Date,[品号] int,[数量] int)
Insert #tab
select N'A001','2019-8-1',1,100 union all
select N'A002','2019-8-2',2,200 union all
select N'A003','2019-8-3',3,300 union all
select N'A004','2019-8-4',1,400 union all
select N'A005','2019-8-5',2,500 union all
select N'A006','2019-8-6',3,600
GO
--测试数据结束

SELECT 单号,日期,品号,数量 
FROM
(
    Select *,ROW_NUMBER() OVER(PARTITION BY [品号] order by [日期]) as rn
    FROM #tab
) AS a
WHERE rn=1;

单号                       日期         品号          数量
------------------------ ---------- ----------- -----------
A001                     2019-08-01 1           100
A002                     2019-08-02 2           200
A003                     2019-08-03 3           300
回答问题 2019.08.28

sql sever 怎么把多行数据归到一行?

答:

图片说明

回答问题 2019.08.28

请问一下有没有大佬知道这部分是什么东西??

答:

这个是web 服务的引用,比如你写了一个web service接口,发布后就是通过这个引用进来的。那些公共的接口,比如天气预报接口都是这样进来的,这样你就可以调用里面的方法返回数据了

回答问题 2019.08.27

C#中主窗口调用子窗口的方法

答:

Creatchart1方法改成静态的public的试试看

回答问题 2019.08.27

sql查询每年每季度销售额前三的地区?

答:

首先quarter()函数可以获取到季度,不用搞得那么麻烦。再用mysql实现开窗函数row_number() over (partition by xxx,xxx order by xxx),取到前三就行了。逻辑就是这样,不懂的再百度下吧

回答问题 2019.08.27

前端如何将console.log()输出的内容写入文件每天生成一个txt文件(如同后台的日志)

答:

ajax调用后台方法保存就行了

回答问题 2019.08.23

为什么我js传的值和浏览器f12下看到的值不同?

答:

onclick方法传参的时候带上单引号,像这样onclick="orderDetail('156542694367329308')"

回答问题 2019.08.22

sql2008 怎么根据数据源匹配归属地

答:
--测试数据
use Tempdb
go
if not object_id(N'Tempdb..#tab1') is null
    drop table #tab1
Go
Create table #tab1([acd] VARCHAR(20))
Insert #tab1
select 15898742658 union all
select 15898732658 union all
select 15898722658
Go

if not object_id(N'Tempdb..#tab2') is null
    drop table #tab2
Go
Create table #tab2([col1] VARCHAR(20),[col2] nvarchar(22),[col3] nvarchar(22))
Insert #tab2
select 1589874,N'江西',N'吉安' union all
select 1589873,N'江西',N'南昌' union all
select 1589872,N'江西',N'赣州'
Go
--测试数据结束


--INSERT INTO tab3(col1,col2,col3)  --如果表tab3存在,则取消注释这一条
SELECT a.acd,b.col2,b.col3
--INTO tab3 --如果表tab3不存在,则取消注释这条
FROM #tab1 AS a
INNER JOIN #tab2 AS b ON left(a.acd,7)=b.col1

图片说明

回答问题 2019.08.20

初学SQLserver,求大神看看哪里问题

答:

只能说sql server 2008 r2中运行没有问题。你再仔细检查下看看吧

回答问题 2019.08.19

sqlserver游标查询use @Name这行报错,我怀疑是@Name类型不支持use,求解决方法

答:
declare @Name nvarchar(200)
declare mycursor cursor for SELECT Name FROM Master..SysDatabases ORDER BY Name
open mycursor

fetch next from mycursor into @Name  
while (@@fetch_status=0)
begin    
 if(substring(@Name,1,3)='POS')
 BEGIN
    print @Name    
    --USE @Name     --不能这样写的
    --go
    --select top 100 * from billsales

    --可以使用动态sql去完成你的功能    
    DECLARE @sql VARCHAR(200);
    SET @sql='SELECT top 100 * FROM '+@name+'..billsales';
    EXEC (@sql);
 END
   fetch next from mycursor into @Name
end
close mycursor
DEALLOCATE mycursor
回答问题 2019.08.06

sql server怎么实现多条不同数据合并一条数据

答:

图片说明
这个技术叫“行转列”,不是你说的不同数据合并一条数据

回答问题 2019.08.06
加载更多