楼主: sanguine
跳转到指定楼层
上一主题 下一主题
收起左侧

[DB|大数据|云计算] [stanford]Introduction to databases (week3) 汇报贴!

🔗
bearkino 2014-1-29 15:58:26 | 只看该作者
全局:
写了大半天了。。  都能写出来但是总是用各种join 各种 union  intersect except 之类的关键词  不能写很高效的代码 忧伤  -。-

week3.jpg (140.27 KB, 下载次数: 0)

week3

week3
回复

使用道具 举报

🔗
chongtianzs 2014-1-29 19:13:54 | 只看该作者
全局:
做得不太顺利
回复

使用道具 举报

🔗
robinyqiu 2014-1-31 09:19:16 | 只看该作者
全局:
大年初一贴作业求学分
顺便问一下Social Network Modification Q2
我原本想写的是:
       delete from
       Likes L1
       where ID1 not in (select ID2
                                    from Likes
                                   where ID1 = L1.ID2) and
                  ID1 in (select ID2
                              from Friend
                             where ID1 = L1.ID2);
但是SQLite里面delete clause是不允许给table命名别名的,这样在子查询里应该怎么refer to外层的ID1和ID2呢?还是应该用别的想法做这道题呢?
更多图片 小图 大图
组图打开中,请稍候......
回复

使用道具 举报

🔗
funkboy 2014-1-31 16:36:26 | 只看该作者
全局:
robinyqiu 发表于 2014-1-31 09:19
大年初一贴作业求学分
顺便问一下Social Network Modification Q2
我原本想写的是:

首先即使可以给table命名你这个方法也是不对的,顶多对这个问题的答案是一样

因为你删除的tuple是match了ID1的值,没有match ID2,而这个问题如果正确解答需要删除的tuple必须同时match ID1和ID2

假设 A和B是朋友,A喜欢B,B也喜欢A,A和C是朋友,A喜欢C,C不喜欢A
用你提出的方方法 得出ID1=A, 那么从like里删除ID1=A的tuple,注意这时A喜欢B也会被删除,因为你仅仅只要ID1 match就删

在那个答题系统里你这个方法对了,只是碰巧他的例子里like中正好没有A喜欢B的tuple

我表述比较罗嗦,不知你明白我的意思没

贴上我的code

delete from likes
where exists( select *
from
(
select l.id1 as a,l.id2 as b
from friend f, likes l
where f.id1=l.id1 and f.id2=l.id2 and f.id1 not in
(select id2 from likes where id1=l.id2)) d
where likes.id1=d.a and likes.id2=d.b
)

评分

参与人数 1大米 +10 收起 理由
sanguine + 10

查看全部评分

回复

使用道具 举报

🔗
robinyqiu 2014-1-31 19:21:52 | 只看该作者
全局:
funkboy 发表于 2014-1-31 16:36
首先即使可以给table命名你这个方法也是不对的,顶多对这个问题的答案是一样

因为你删除的tuple是matc ...

谢谢~用exists确实是好办法。。。但是你指出的问题其实我并没有犯。。。我where从句里面的两个子查询都是相关子查询而不是独立子查询,两处里面提到了L1.ID2也就是最外层的ID2,不知道我说的是否明白?
回复

使用道具 举报

🔗
funkboy 2014-2-1 04:59:35 | 只看该作者
全局:
robinyqiu 发表于 2014-1-31 19:21
谢谢~用exists确实是好办法。。。但是你指出的问题其实我并没有犯。。。我where从句里面的两个子查询都是 ...

你两个子查询确实是用了外层的id2,两个子查询返回的id1也是正确的

但是delete的语句里where只用了id1一个变量名,这个delete的意思是table里任何的tuple只要id1等于你两个子查询返回出来的值就删除那个tuple

用我举的那个例子就是两个子查询返回的是正确的id1的值,为A,那条query就可以简化为delete from likes where id1=‘A’

因此只要是id=‘A’的tuple都被删了,但是实际上要的是delete from likes where id1=‘A’ and id2=‘B’
回复

使用道具 举报

🔗
robinyqiu 2014-2-1 08:13:08 | 只看该作者
全局:
funkboy 发表于 2014-2-1 04:59
你两个子查询确实是用了外层的id2,两个子查询返回的id1也是正确的

但是delete的语句里where只用了id1 ...

你好,鉴于我还是相信我是对的而且你说的也有道理,我用我电脑上的MySQL做了一个实验:语句和结果都显示在截图里面,很清楚。
对于你说的ABC,我依次给了ID123,456,234,Step3里是我用我原来完全不变的思想,听你的建议套上一个exists语句写成的delete语句。
至于结果为什么是对的而不是你说的情况,我觉得应该是这么解释:SQL实际执行的时候是对每一个tuple分别查看条件是否符合,所以内层的L2.ID2和外层的ID1是在一个tuple里的,而并不是像你说的那样把所有ID1求出来放进一个集合,然后再执行delete语句,换句话说我觉得内层的子查询也是执行n次而不是执行一次的,不知道我说的是否清楚。期待下次在与你讨论。
更多图片 小图 大图
组图打开中,请稍候......

评分

参与人数 1大米 +10 收起 理由
sanguine + 10

查看全部评分

回复

使用道具 举报

🔗
funkboy 2014-2-2 01:55:59 | 只看该作者
全局:
robinyqiu 发表于 2014-2-1 08:13
你好,鉴于我还是相信我是对的而且你说的也有道理,我用我电脑上的MySQL做了一个实验:语句和结果都显示在 ...

你好 ,不好意思了,我的表述还是不清楚。 我说的是你最早发的那个query即使可以给delete table命名也不是正确的,是因为你where从句里只有id1一个变量所以不正确,但是子query里找出id1的思想是完全正确的。

你这个用exist的是完全正确的,因为你delete where从句里用的是 exists (select *, Select * 表示的是的从你的子query的结果里选取整个一条tuple,在被删除的table里match整条tuple并删除。子query的结果是一个包含id1和id2的tuple,所以在删除是要同时match id1和id2,所以就完全没问题啦!

赞你的钻研精神!
回复

使用道具 举报

🔗
tim900925 2014-2-2 13:26:42 | 只看该作者
全局:
做到吐血了还是做不出SocialMod的Q3...还有好多其他作业,只好放弃了。。。
不知道为啥我在排除重复的朋友关系时重复部分比全部的还多。。。
更多图片 小图 大图
组图打开中,请稍候......
回复

使用道具 举报

🔗
karte_polo 2014-2-2 17:08:13 | 只看该作者
全局:
补交作业
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表