求帮忙优化优化语句。

夕阳丶晨曦 2014-12-19 05:10:37
SELECT KK.WORD
FROM KEYWORD KK
WHERE EXISTS (SELECT KC.KID
FROM CLASS CC, KEYWORD_CLASS KC
WHERE CC.CID = KC.CID
AND KC.KID = KK.KID
AND CC.NAME IN ('门户网站'))
AND EXISTS (SELECT KC.KID
FROM CLASS CC, KEYWORD_CLASS KC
WHERE CC.CID = KC.CID
AND KC.KID = KK.KID
AND CC.NAME IN ('搜索引擎'))
AND NOT EXISTS (SELECT KC.KID
FROM CLASS CC, KEYWORD_CLASS KC
WHERE CC.CID = KC.CID
AND KC.KID = KK.KID
AND CC.CID NOT IN (SELECT CID FROM CLASS WHERE CC.NAME IN ('门户网站', '搜索引擎'));
...全文
157 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2014-12-22
  • 打赏
  • 举报
回复
SELECT KK.WORD
  FROM KEYWORD KK
 WHERE EXISTS (SELECT KC.KID
          FROM CLASS CC, KEYWORD_CLASS KC
         WHERE CC.CID = KC.CID
           AND KC.KID = KK.KID
group by kc.kid
having sum(decode(cc.name,'门户网站',0,'搜索引擎',0,1))=0
and sum(decode(cc.name,'门户网站',1,'搜索引擎',1,0))=2
)
夕阳丶晨曦 2014-12-22
  • 打赏
  • 举报
回复
引用 2 楼 a6511596 的回复:
[quote=引用 1 楼 bw555 的回复:]
WITH CC AS(
select CID FROM CLASS CC
WHERE NAME IN ('门户网站', '搜索引擎')
GROUP BY CID HAVING COUNT(DISTINCT NAME)=2
)
SELECT KK.WORD
FROM KEYWORD KK
WHERE EXISTS(SELECT 1 FROM CC,KEYWORD_CLASS KC
    WHERE CC.CID = KC.CID
    AND KC.KID = KK.KID)
不懂啊!!![/quote] 我的表系多对多的:你的with as 里面都错了。表结构: keyword( kid , word)【MyISAM引擎,kid为自增字段】 1,'百度' 2,'新华网' 3,'谷歌' 4,'人人网' class(cid,name)【MyISAM引擎,cid为自增字段】 1,'门户网站’ 2,'搜索引擎' 3,'门内网站' keyword_class(kid,cid)【MyISAM引擎,kid,cid分别来自其他两个表】 1,1 1,2 1,3 2,1 3,1 3,2 3,3 4,1 4,2
夕阳丶晨曦 2014-12-22
  • 打赏
  • 举报
回复
引用 5 楼 bw555 的回复:
瞬间崩溃了,1楼不就是改好的语句吗?
哈哈、。我看了看with as 用法、瞬间懂了。但是1楼的结果不对、返回空值。。。
夕阳丶晨曦 2014-12-22
  • 打赏
  • 举报
回复
引用 8 楼 bw555 的回复:
SELECT KK.WORD
FROM KEYWORD KK
WHERE EXISTS (SELECT KC.KID
FROM CLASS CC, KEYWORD_CLASS KC
WHERE CC.CID = KC.CID
AND KC.KID = KK.KID
group by kc.kid
having sum(decode(cc.name,'门户网站',0,'搜索引擎',0,1))=0
and sum(decode(cc.name,'门户网站',1,'搜索引擎',1,0))=2
)

我发现两条语句效率一样的啊、什么原因啊???感觉我之前的比这个还快。我之前的语句、加order by 之后
修改后的语句:我只是分页取前20条记录的对比。。
bw555 2014-12-19
  • 打赏
  • 举报
回复
瞬间崩溃了,1楼不就是改好的语句吗?
夕阳丶晨曦 2014-12-19
  • 打赏
  • 举报
回复
引用 3 楼 bw555 的回复:
1、with as用法 2、having的用法 3、整体思路: cc的查询查出来是name有且仅有'门户网站', '搜索引擎'这两个值的cid,利用这个中间结果再去执行后面查询
瞬间有一个疑问了:你怎么不直接帮我改了啊!!!
bw555 2014-12-19
  • 打赏
  • 举报
回复
1、with as用法 2、having的用法 3、整体思路: cc的查询查出来是name有且仅有'门户网站', '搜索引擎'这两个值的cid,利用这个中间结果再去执行后面查询
夕阳丶晨曦 2014-12-19
  • 打赏
  • 举报
回复
引用 1 楼 bw555 的回复:
WITH CC AS(
select CID FROM CLASS CC
WHERE NAME IN ('门户网站', '搜索引擎')
GROUP BY CID HAVING COUNT(DISTINCT NAME)=2
)
SELECT KK.WORD
FROM KEYWORD KK
WHERE EXISTS(SELECT 1 FROM CC,KEYWORD_CLASS KC
    WHERE CC.CID = KC.CID
    AND KC.KID = KK.KID)
不懂啊!!!
bw555 2014-12-19
  • 打赏
  • 举报
回复
WITH CC AS(
select CID FROM CLASS CC
WHERE NAME IN ('门户网站', '搜索引擎')
GROUP BY CID HAVING COUNT(DISTINCT NAME)=2
)
SELECT KK.WORD
FROM KEYWORD KK
WHERE EXISTS(SELECT 1 FROM CC,KEYWORD_CLASS KC
WHERE CC.CID = KC.CID
AND KC.KID = KK.KID)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧