Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql联接问题-未提供预期输出_Sql_Join - Fatal编程技术网

sql联接问题-未提供预期输出

sql联接问题-未提供预期输出,sql,join,Sql,Join,我是一个SQLNoob,所以这对你们来说可能是非常基本的,但我在这里很难应用一些逻辑。我试图从两个表(供应商与消费者表)中生成一个所有城市和州的列表,并通过第三个transact表链接,列出每个城市的供应商和消费者数量(按分组)。需要注意的是,两个表中的城市和州的数量不匹配。对于那些匹配的,我需要一个显示相应供应商和消费者数量的输出,如果一个表中存在州/市,而另一个表中不存在,我需要在相应的数字列下显示一个零的数字计数。 我有3个表-供应商、消费者和交易,通过Supp_ID和Con_ID作为键链

我是一个SQLNoob,所以这对你们来说可能是非常基本的,但我在这里很难应用一些逻辑。我试图从两个表(供应商与消费者表)中生成一个所有城市和州的列表,并通过第三个transact表链接,列出每个城市的供应商和消费者数量(按分组)。需要注意的是,两个表中的城市和州的数量不匹配。对于那些匹配的,我需要一个显示相应供应商和消费者数量的输出,如果一个表中存在州/市,而另一个表中不存在,我需要在相应的数字列下显示一个零的数字计数。 我有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
如果我输入这个查询,我会得到供应商和消费者的奇怪数字。我最好的猜测是,在那里的某个地方必须有一个自连接,但不确定如何从这里开始。任何帮助都将不胜感激!谢谢你

附言:

分别从两个表中提供所需的输出。输出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
首先,切勿在
FROM
子句中使用逗号。始终使用明确、正确的
JOIN
语法

您的问题是,您沿着两个不相关的维度连接,因此您的查询为每个
/
城市
组合生成笛卡尔积。最简单的解决方案是使用
COUNT(DISTINCT)


如果每个维度上没有太多的重复项,则此操作很好。更“合适”的解决方案是在进行连接之前进行聚合。

更新-我自己得到了答案!!我首先创建了一个新表来列出我感兴趣的所有不同的州和城市(使用
UNION
而不是
UNION all
来消除我之前得到的DUP),然后使用
FULL JOIN
s将供应商和消费者表链接并组合到这个新表

啊!当你对编程语言完全陌生的时候,独自完成一个查询的乐趣是……无与伦比的!!
谢谢大家!

感谢您的时间,同意JOIN-in语法提供了很好的清晰度。但查询仍然没有给出所需的输出。。我做了一些编辑,包括我真正需要的,并包括了我使用左连接所做的最新跟踪。。获得了正确的客户数量,但仍然获得了大量的供应商数量(就像我运行您的查询时一样)@Cur123。您使用的是计数(独立)?是的,我使用了,林诺夫先生。我使用UNION得到了答案,首先创建了一个临时表,然后通过完整的外部联接将临时表链接到供应商和消费者表,以获得我想要的确切结果。花了很长时间,但最终还是很满意!我一拿到答案就自己发了。。如果我没有说清楚的话,我向你道歉。。再次感谢您的支持!我接受了你的建议,并使用了正确的语法进行连接,这确实让我更清楚了……再次感谢!)
 State       City      Supp_count       Cons_count
 Illinois    Chicago      2                 3
 Illinois  Springfield    2                 0
 Michigan   Lansing       0                 3
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
SELECT S.State, S.City,
       COUNT(DISTINCT S.Supp_ID) AS Supp_Count,
       COUNT(DISTINCT C.Con_ID) AS Cust_Count 
FROM SuppTb S JOIN
     TransTb T
     ON S.Supp_ID = T.Supp_ID JOIN
     ConsTb C
     ON T.Con_ID = C.Con_ID
GROUP BY S.State, S.City;