sql join问题 - 没有给出预期的输出

时间:2017-03-11 11:07:53

标签: sql join

我是一个SQL菜鸟,所以这对你们所有人来说都是非常基本的,但我在这里努力应用一些逻辑。我试图从2个表(供应商与消费者表)中生成所有城市和州的列表,由第3个交易表链接,并列出每个城市中供应商和消费者的数量(按分组)。值得注意的是,2个表中的城市和州的数量不匹配。对于那些匹配的,我需要一个显示相应数量的供应商和消费者的输出,如果状态/城市存在于一个表而不是另一个表中,我需要在相应的数字列下显示一个零数字。 我有3个表 - 由Supp_ID和Con_ID链接的供应商,消费者和交易作为密钥,如下面的代码中所述。

SELECT S.State, S.City, COUNT(S.Supp_ID) AS Supp_Count, COUNT(C.Con_ID) AS Cust_Count 
FROM SuppTb S, TransTb T, ConsTb C
WHERE S.Supp_ID = T.Supp_ID AND T.Con_ID = C.Con_ID
GROUP BY S.State, S.City

如果我输入此查询,我会得到奇怪的数字,反对供应商和消费者的数量。我最好的猜测是,必须在那里的某个地方进行自我加入,但不知道如何从这里开始。任何帮助,将不胜感激!谢谢你

PS:

SELECT DISTINCT City, State, COUNT(Supp_ID)
FROM SuppTb S GROUP BY City, State

SELECT DISTINCT City, State, COUNT(Con_ID)
FROM ConTb C GROUP BY City, State

分别从两个表中给出了我需要的输出。输出1有3列7行,输出2有3列和6行。我需要一个单列组合输出,有4列和8行。只需要找出一种方法来组合这两个输出并在需要的地方插入零。

编辑 - 确切的问题是生成供应商或消费者国家和城市的比较列表,每个城市都有相应数量的供应商和消费者。期望的输出 -

 State       City      Supp_count       Cons_count
 Illinois    Chicago      2                 3
 Illinois  Springfield    2                 0
 Michigan   Lansing       0                 3

等,即如果supp / cons表没有列出城市/州,则输出为0。

编辑2-尝试了这段代码,给了我所需的客户数量计数,但给出了有关供应商数量的奇怪数字。我现在完全陷入困境!耗尽了想法..

SELECT C.State, C.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count,      COUNT(DISTINCT C.Con_ID) AS Cust_Count 
FROM Tb_Supplier S LEFT JOIN Tb_Transactions T
ON S.Supp_ID = T.Supp_ID LEFT JOIN
    Tb_Consumer C ON T.Con_ID = C.Con_ID
    GROUP BY C.State, C.City
 EXCEPT
 SELECT S.State, S.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count,    COUNT(DISTINCT C.Con_ID) AS Cust_Count 
 FROM Tb_Supplier S LEFT JOIN Tb_Transactions T
 ON S.Supp_ID = T.Supp_ID LEFT JOIN
    Tb_Consumer C ON T.Con_ID = C.Con_ID
 GROUP BY S.State, S.City

2 个答案:

答案 0 :(得分:1)

首先,从不O(n)子句中使用逗号。 始终使用明确,正确的O(1)语法。

您的问题是您要加入两个不相关的维度,因此您的查询会为每个FROM / JOIN组合生成一个笛卡尔积。最简单的解决方案是使用state

city

如果每个维度上没有太多重复项,这样可以正常工作。更多"适当"解决方案是在进行连接之前聚合

答案 1 :(得分:0)

更新 - 我自己得到了答案!我首先创建了一个新表,列出了我感兴趣的所有DISTINCT州和城市(使用UNION代替UNION ALL来消除我之前获得的重复项),然后使用{ {1}用于将供应商和消费者表链接并组合到此新表中。

唉唉!当您对编程语言完全陌生时,自己获得正确查询的乐趣只是......无可比拟! 谢谢!