根据另一个表中id的出现次数进行选择

时间:2009-09-28 14:45:30

标签: sql

我有一张带有电视和城市的表B.我还有一个表C,其中包含这些带有额外信息的cid。我想列出表C中与表B中给定城市的所有外观相关联的所有cid。

我目前的解决方案依赖于计算给定城市在表B中出现的次数,并仅选择多次出现的cid。我还不知道所有的SQL语法,但有没有办法选择这种模式?

我目前的解决方案:

SELECT Agents.aid
FROM Agents, Customers, Orders
WHERE (Customers.city='Duluth') 
AND (Agents.aid = Orders.aid) 
AND (Customers.cid = Orders.cid)
GROUP BY Agents.aid
HAVING count(Agents.aid) > 1

它才有效,因为我现在知道HAVING语句。

感谢您的帮助。我不确定如何谷歌这个问题,因为它非常具体。

编辑:我正在查明我的问题。我需要知道如何确定表中的每一行是否具有某个字段的特定值。声明一个变量并计算一个子选择中的行,并按照多次出现的ID过滤掉我的结果,但这真的很难看。

有一种方法可以在没有明确count()行的情况下执行此操作。我希望。

3 个答案:

答案 0 :(得分:0)

首先,您可以(并且应该)使用JOIN而不是WHERE子句中的内容,例如,

select Agents.aid
from Agents
join Orders on Agents.aid = Orders.aid
join Customers on Customers.cid = Orders.cid
where Customers.city = 'Duluth'
group by Agents.aid
having count(Agents.aid) > 1

在那之后,我担心我可能会有点失落。使用示例查询中的表名,您要检索的是什么(英文,而不是伪代码)?例如,我认为您的示例查询正在为在德卢斯至少涉及Agents Orders Customers的所有Agents检索PK。

此外,OrdersCustomers和{{1}}的某些表定义可能有所帮助(然后,它们可能无关紧要)。

答案 1 :(得分:0)

不是你问题的答案,而是一般的改进。 我建议使用JOIN语法将表格连接在一起 这会将您的查询更改为:

SELECT Agents.aid
FROM Agents
INNER JOIN Orders
ON Agents.aid = Orders.aid
INNER JOIN Customers
ON Customers.cid = Orders.cid
WHERE Customers.city='Duluth' 
GROUP BY Agents.aid
HAVING count(Agents.aid) > 1

您使用的是SQL的哪种变体?

答案 2 :(得分:0)

我不确定我是否理解你的问题,但我认为以下查询是你想要的:

    SELECT *
      FROM customers b
INNER JOIN orders c USING (cid)
     WHERE b.city = 'Duluth'
       AND NOT EXISTS (SELECT 1
                         FROM customers b2
                        WHERE b2.city = b.city
                          AND b2.cid <> cid);

可能你需要在这些列上使用一些索引。