我正在进行一些书籍练习,无法找到关于如何在关系代数中表达以下内容的解释。我确实找到了answer for SQL though,但我对是否有任何替代方案感兴趣。
本书的问题是:找到那些具有相同速度和RAM的PC模型。一对应该只列出一次;例如,列表(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
根据以下构造的关系代数表达式:
因此,在SQL查询和关系代数中,匹配结果将按两个相反的顺序列出。无论订单如何,我如何只列出一次?
答案 0 :(得分:4)
只要使用PC.model != PC1.model
,那么一个比另一个小。因此,如果您需要其中一对,请使用PC.model < PC1.model
或PC.model > PC1.model
(取决于您要保留哪一对)。
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;
答案 1 :(得分:0)
这是一个选项:
SELECT DISTINCT LEAST(pc1.model, pc2.model),
GREATEST(pc1.model, pc2.model)
FROM PC pc1
INNER JOIN PC AS pc2
ON pc1.model <> pc2.model
WHERE pc1.speed = pc2.speed AND
pc1.ram = pc2.ram;