如何从笛卡尔积返回属性?及Mark Yee论文panum查询问题
解决笛卡尔积中正确返回属性的问题
你的核心问题是没给关联表加上匹配条件,导致产生了无意义的笛卡尔积,最后得到的结果自然不对。咱们一步步来修正:
先理清楚关联逻辑
要找到Mark Yee的论文编号panum,得按这个逻辑走:
- 从
ACADEMIC表定位到Mark Yee的学者编号acnum - 通过
AUTHOR这个中间关联表,找到该学者对应的所有论文编号panum
你的原语句问题
你写的:
SELECT PANUM FROM ACADEMIC, AUTHOR WHERE FAMNAME LIKE '%Yee%' AND GIVENAME LIKE '%Mark%';
这里直接把ACADEMIC和AUTHOR放在一起,却没指定ACADEMIC.acnum = AUTHOR.acnum这个关键关联条件,会生成两个表的笛卡尔积——也就是把每个学者的记录和每一条作者记录都强行配对一遍。最后筛选Mark Yee时,相当于把所有论文编号都和他的信息组合了一次,结果里会混进大量不属于他的论文编号,完全不符合需求。
正确的SQL写法
推荐用INNER JOIN来明确表之间的关联关系,逻辑清晰还能避免笛卡尔积:
写法1:只关联必要的两张表(已能得到目标panum)
SELECT au.panum FROM ACADEMIC a INNER JOIN AUTHOR au ON a.acnum = au.acnum WHERE a.famname = 'Yee' AND a.givename = 'Mark';
写法2:关联到PAPER表(如果需要同时查看论文标题等额外信息)
SELECT p.panum, p.title FROM ACADEMIC a INNER JOIN AUTHOR au ON a.acnum = au.acnum INNER JOIN PAPER p ON au.panum = p.panum WHERE a.famname = 'Yee' AND a.givename = 'Mark';
补充小提示
- 用
LIKE '%Yee%'可能会匹配到姓氏包含Yee的其他学者,如果确认Mark Yee的姓氏就是Yee、名字就是Mark,直接用=更精准。 INNER JOIN会只保留满足关联条件的记录,完美规避笛卡尔积带来的冗余数据。
内容的提问来源于stack exchange,提问作者Shroomy
相关产品推荐
相关产品推荐

