我正在做一些书本练习,找不到关于如何用关系代数来表达下面的问题的解释,我确实找到了一个answer for SQL though,但我对是否有替代方法来解决它很感兴趣。
书中的问题是:* 找出具有相同速度和内存的电脑型号对。一对电脑只应列出一次;例如列表(i,j)而不是(j,i)。*
PC的模式为:
PC (
model INTEGER NOT NULL PRIMARY KEY,
speed NUMERIC,
ram INTEGER,
hd INTEGER,
price INTEGER);
我提出的问题
SELECT PC.model, PC1.model
FROM PC, PC AS PC1
WHERE PC.model != PC1.model AND PC.speed = PC1.speed AND PC.ram = PC1.ram;
该函数返回:
model | model
-------+-------
1004 | 1012
1012 | 1004
关系代数表达式I根据以下公式构建:
1.定义名为PC1的PC副本,并将属性"model"重命名为"model1"。
1.投影PC的型号、速度和内存以及PC1的型号1、速度和内存。
1.θ连接PC和PC1的上述投影,条件是model1 = model1。
1.从(3)中的结果投影模型和模型1。
因此,在SQL查询和关系代数中,匹配结果都将以相反的顺序列出两次,我如何使它只列出一次而不考虑顺序呢?
3条答案
按热度按时间i7uaboj41#
只要使用如果
PC.model != PC1.model
,那么一个比另一个小,所以如果你需要这些对中的一个,只要使用PC.model < PC1.model
或PC.model > PC1.model
(取决于你想保留哪一对)。qnyhuwrf2#
以下是一个选项:
of1yzvn43#
对你得到的关系进行自连接,并连接那些相似的关系,例如1,2和2,1项目的第一列