从SQL表中选择一对

时间:2014-01-22 23:43:24

标签: sql postgresql

我想选择一对符合特定要求的供应商ID,即第一个供应商收取的费用高于某个部分的第二个供应商ID。

SELECT DISTINCT S1.sid, S2.sid
FROM suppliers JOIN catalog ON (suppliers.sid = catalog.sid) AS S1,
suppliers JOIN catalog ON (suppliers.sid = catalog.sid) AS S2
WHERE S1.pid = S2.pid AND S1.cost > S2.cost;

现在这不起作用。谁能告诉我问题出在哪里?

2 个答案:

答案 0 :(得分:1)

你表达联接的方式出错了:左边的表(即suppliers)不需要为每个添加到查询中的表重复。

以下是使用表别名修复查询的方法:

SELECT DISTINCT S1.sid, S2.sid 
FROM suppliers s
JOIN catalog s1 ON s.sid=s1.sid
JOIN catalog s2 ON s.sid=s2.sid 
WHERE S1.pid=S2.pid AND S1.cost>S2.cost

答案 1 :(得分:1)

您的查询的一个问题是您在from子句中多次使用相同的表而没有表别名来区分不同的引用。

以下是一种不同的方法,它使用CTE将supplierscatalogs合并为一个简单的连接:

with sc as (
      select s1.sid, pid, cost
      from suppliers s1 join
           catalog c1
           on s1.sid = c1.sid
     )
select distinct sc1.sid, sc2.sid
from sc sc1 join
     sc sc2
     on sc1.pid = sc2.pid and sc1.cost > sc2.cost;

此请求似乎是一个奇怪的请求 - 如果您有一个给定零件的多个供应商,您将获得许多行。

编辑:

令我感到震惊的是你根本不需要suppliers表:

select distinct c1.sid, c2.sid
from catalog c1 join
     catalog c2
     on c1.pid = c2.pid and c1.cost > c2.cost;