新足迹

 找回密码
 注册

精华好帖回顾

· 迪拜和印度,游走在天堂与地狱之间----一家5口14天自由行 更新至泰姬陵 (2017-2-10) gracewq · 胶片扫街.堪培拉 (2015-5-30) workflow
· 旧纸箱的利用(更新,第三个成果——化妆盒华丽登场~) (2009-7-13) edith921 · 华人快递内幕大起底 (2010-2-18) paula123
Advertisement
Advertisement
查看: 3772|回复: 61

sql 初级问题。 呼唤达人。 [复制链接]

头像被屏蔽

禁止发言

发表于 2010-10-21 09:17 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
two tables.

table A {account, accountName}

table B {account}

如何一个statement,

select  account, accountName, C(if account in table b, "yes", otherwise, "No") from A
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-10-21 09:20 |显示全部楼层

哪个好????

此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
select A.account,
case
when account in (select distinct account from B) then 'yes'
else 'No' end as C
from A

SELECT account,
CASE WHEN (EXISTS (SELECT * FROM B WHERE account=B.account)) THEN 'yes'
ELSE 'no' End C
FROM  A

SELECT distinct A.account,
CASE WHEN (B.account is null) THEN 'no'
ELSE 'yes' End AS C
FROM  A
LEFT JOIN B
ON A.account=B.account

[ 本帖最后由 澳贼 于 2010-10-21 10:53 编辑 ]
签名被屏蔽

发表于 2010-10-21 09:34 |显示全部楼层
此文章由 rogerk 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rogerk 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这自问自答算是教学贴么?

发表于 2010-10-21 09:35 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
LZ看过"狼来了"吗?

发表于 2010-10-21 09:36 |显示全部楼层
此文章由 docwxy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 docwxy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SELECT account,accountName,
CASE WHEN (EXISTS (SELECT * FROM b WHERE account=b.account)) THEN 'yes'
ELSE 'no' End C
FROM  a
头像被屏蔽

禁止发言

发表于 2010-10-21 09:36 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rogerk 于 2010-10-21 10:34 发表
这自问自答算是教学贴么?


自我教育贴
签名被屏蔽
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-10-21 09:37 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 docwxy 于 2010-10-21 10:36 发表
SELECT account,accountName,
CASE WHEN (EXISTS (SELECT * FROM b WHERE account=b.account)) THEN 'yes'
ELSE 'no' End C
FROM  a


和我的有区别么?
签名被屏蔽
头像被屏蔽

禁止发言

发表于 2010-10-21 09:37 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 zn7726 于 2010-10-21 10:35 发表
LZ看过"狼来了"吗?


三次,我才两次。
签名被屏蔽

退役斑竹

发表于 2010-10-21 09:38 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
看完一楼,想了一下,刚想给LZ写个答案,紧接着看见了二楼。

强烈要求LZ赔偿死亡的脑细胞损失

评分

参与人数 1积分 +1 收起 理由
澳贼 + 1 补偿脑细胞

查看全部评分

退役斑竹

发表于 2010-10-21 09:39 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-10-21 10:37 发表


和我的有区别么?


你的没有accountName  

发表于 2010-10-21 09:40 |显示全部楼层
此文章由 rumcoke 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rumcoke 所有!转贴必须注明作者、出处和本声明,并保持内容完整
where .. in 太消耗资源了 where exists  还都稍微强点
也可以考虑left join, 看你的case应该是a的记录多于b?
select if(b.account is null,'no','yes') from a
left join b on account

类似这样的 具体的sql语句你懂的
但是速度也肯定快不起来
不好意思编辑一下 我也没睡醒 刚才写了个什么东西.....

我们公司的dashboard就因为有一个no exists in导致loading差不多半分钟才出来

[ 本帖最后由 rumcoke 于 2010-10-21 10:45 编辑 ]

评分

参与人数 2积分 +7 收起 理由
澳贼 + 3 那种效率最高???
月亮 + 4 我很赞同

查看全部评分

Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-10-21 09:42 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 月亮 于 2010-10-21 10:39 发表


你的没有accountName  


签名被屏蔽

发表于 2010-10-21 09:48 |显示全部楼层
此文章由 rumcoke 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rumcoke 所有!转贴必须注明作者、出处和本声明,并保持内容完整
楼上我自己那个回答我编辑了一下 刚才还比较迷糊都不知道自己写了个啥东西...

个人认为一般情况下join的效率还可以 但是两个大的数据表的交叉尤其这种判断存在的 基本没有什么太好的优化办法 所以数据建模很重要啊 在a表弄个flag表示是否存在于b才是最好的办法

退役斑竹

发表于 2010-10-21 09:49 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rumcoke 于 2010-10-21 10:40 发表
where .. in 太消耗资源了 where exists  还都稍微强点
也可以考虑left join, 看你的case应该是a的记录多于b?
select if(b.account is null,'no','yes') from a
left join b on account

类似这样的 具体的sql语句你 ...


我的理解是这样,如果sub query得出的results较少,主query中的table较大又有index时应该用in,
反之如果主query得出的results较少,sub query中的table大,又有index时用exists。

注意,in不能处理NULL Value.
头像被屏蔽

禁止发言

发表于 2010-10-21 09:51 |显示全部楼层

根据 rumcoke, 改成

此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SELECT distinct A.account,
CASE WHEN (B.account is null) THEN 'no'
ELSE 'yes' End AS C
FROM  A
LEFT JOIN B
ON A.account=B.account

发表于 2010-10-21 09:54 |显示全部楼层

回复 14# 的帖子

此文章由 rumcoke 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rumcoke 所有!转贴必须注明作者、出处和本声明,并保持内容完整
同意 我写的显然是没有考虑使用index的情况下 换句话说 简易的应用
如果要求很高或者transaction很多 应该多考虑index解决速度问题
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-10-21 09:55 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rumcoke 于 2010-10-21 10:48 发表
楼上我自己那个回答我编辑了一下 刚才还比较迷糊都不知道自己写了个啥东西...

个人认为一般情况下join的效率还可以 但是两个大的数据表的交叉尤其这种判断存在的 基本没有什么太好的优化办法 所以数据建模很重要啊  ...


flag当然效率高。但是必须经常update,不是么??
签名被屏蔽

发表于 2010-10-21 10:01 |显示全部楼层
此文章由 rumcoke 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rumcoke 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你可以在b插入数据的时候去如果此account也存在于a就更新a里面的flag?
比如就叫'in b', 默认是0 update成1

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2010-10-21 10:02 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
For oracle I would do this:

select a.account, a.accountName, decode( b.account, null,'no','yes') C
from a, b
where a.account = b.account(+)

本帖最后由 黑山老妖 于 2010-10-21 11:08 编辑

评分

参与人数 1积分 +3 收起 理由
jands + 3 我很赞同

查看全部评分

Happy Wife = Happy Life
头像被屏蔽

禁止发言

发表于 2010-10-21 10:04 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rumcoke 于 2010-10-21 11:01 发表
你可以在b插入数据的时候去如果此account也存在于a就更新a里面的flag?
比如就叫'in b', 默认是0 update成1


那update不消耗资源么??难道用trigger?
签名被屏蔽

退役斑竹

发表于 2010-10-21 10:04 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 黑山老妖 于 2010-10-21 11:02 发表
For oracle I would do this:

select a.account, b.accountName, decode( b.account, null,'no','yes') C
from a, b
where a.account = b.account(+)


oracle果然比sql简洁
Advertisement
Advertisement

发表于 2010-10-21 10:04 |显示全部楼层
此文章由 zn7726 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zn7726 所有!转贴必须注明作者、出处和本声明,并保持内容完整
一直就没弄明白SQL Server里的什么left join呀之类的 ... 还是Oracle的SQL简洁.

老妖那个看着挺好的. 不过没仔细看LZ原题, 不知道对错.
头像被屏蔽

禁止发言

发表于 2010-10-21 10:04 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 黑山老妖 于 2010-10-21 11:02 发表
For oracle I would do this:

select a.account, a.accountName, decode( b.account, null,'no','yes') C
from a, b
where a.account = b.account(+)


TSQL 有没有类似的builtin function?
签名被屏蔽

退役斑竹

发表于 2010-10-21 10:07 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-10-21 11:04 发表


那update不消耗资源么??难道用trigger?


要查询快通常是要损害update的,比如作index也是这样,要看你查询和update的频率有多高,再决定值不值得这样做

退役斑竹

发表于 2010-10-21 10:08 |显示全部楼层
此文章由 月亮 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 月亮 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 澳贼 于 2010-10-21 11:04 发表


TSQL 有没有类似的builtin function?


case就是builtin function。。
头像被屏蔽

禁止发言

发表于 2010-10-21 10:08 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 zn7726 于 2010-10-21 11:04 发表
一直就没弄明白SQL Server里的什么left join呀之类的 ... 还是Oracle的SQL简洁.

老妖那个看着挺好的. 不过没仔细看LZ原题, 不知道对错.


毕竟oracle是专门作数据库的。
签名被屏蔽
Advertisement
Advertisement
头像被屏蔽

禁止发言

发表于 2010-10-21 10:10 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 月亮 于 2010-10-21 11:07 发表


要查询快通常是要损害update的,比如作index也是这样,要看你查询和update的频率有多高,再决定值不值得这样做


看来你是专么搞这个的,以后专门请教你了
签名被屏蔽

退役斑竹 2007 年度奖章获得者 2008年度奖章获得者 特殊贡献奖章 参与宝库编辑功臣

发表于 2010-10-21 10:12 |显示全部楼层
此文章由 黑山老妖 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 黑山老妖 所有!转贴必须注明作者、出处和本声明,并保持内容完整
oracle的select statement里面也可以用 case 或是 if ,但是没有decode这么简洁。当然了decode只能做很简单的比较。不能有Logical comparison。

发表于 2010-10-21 10:13 |显示全部楼层
此文章由 rumcoke 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 rumcoke 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果update发生的频率高于查询那还是不要考虑总去update2个表了
头像被屏蔽

禁止发言

发表于 2010-10-21 10:19 |显示全部楼层
此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rumcoke 于 2010-10-21 11:13 发表
如果update发生的频率高于查询那还是不要考虑总去update2个表了


table A 每天都要清空,从新load
签名被屏蔽

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部