2014-01-22 28 views
0

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

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; 

现在这是行不通的。谁能告诉我问题在哪里?

+1

你能细说什么“这是不工作”的意思? – Dan

+0

以下是错误: 错误:在“as”或附近的语法错误 *** 1:...钳子将*******错误********** 错误:语法错误处于或接近“as” – KellyJ

+0

您是否在尝试某种条件JOIN?显示一些示例数据。 – Mihai

回答

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

一个与您的查询的问题是,你有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;