我有一张带有电视和城市的表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()行的情况下执行此操作。我希望。
答案 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。
此外,Orders
,Customers
和{{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);
可能你需要在这些列上使用一些索引。