Sql 寻找正确的联接(获取重复项)

Sql 寻找正确的联接(获取重复项),sql,sql-server,Sql,Sql Server,我在创建查询时遇到问题。但在我问你这些问题之前,请先看一下我需要使用的三张桌子: 表1//AdminInvoices [AdminId] [InvoiceId] (...) 表2//AdminClientSystem [AdminId] [ClientId] (...) 表3//ClientData [CompanyId] [CompanyName] (...) 有关表的更多说明: 表1 InvoiceId通常不是唯一的,但对于公司来说是唯一的,即: AdminId Invoice

我在创建查询时遇到问题。但在我问你这些问题之前,请先看一下我需要使用的三张桌子:

表1//AdminInvoices

[AdminId] [InvoiceId] (...)
表2//AdminClientSystem

[AdminId] [ClientId] (...)
表3//ClientData

[CompanyId] [CompanyName] (...)
有关表的更多说明:

表1

InvoiceId通常不是唯一的,但对于公司来说是唯一的,即:

AdminId     InvoiceId
16              1
14              1
24              1
3149            1
3150            1
3159            2
3157            2
3150            2
3149            2
3145            2
16              3
14              3
24              3
2015            3
3149            3
3159            4
3157            4
3150            4
表2:

AdminId       CompanyId
3                 1
3                 1
3                 1
3                 1
3                 1
3                 1
3                 2
3                 2
3                 3
3                 4
3                 4
3                 4
3                 9
3                 9
3                 9
3                 9
3                 9
3                 9
3                 9
3                 9
3                 13
3                 13
3                 13
表3:

CompanyId   CompanyName
1              C1
2              C2
3              C3
9              C4
13             C5
我在使用join创建正确的查询时遇到问题。在我的例子中,我总是得到多余的数据作为答案。我想得到的是每家公司的发票数量

假设我确信C1生成了100张发票,C2 50和C3 200。无论我做什么查询,这些数字都是原来的两倍甚至更大——其他表中的一些行被复制到了一般结果中

我所尝试的:

SELECT CL.CompanyName, count([IncentiveId]) 
FROM AdminInvoices
INNER JOIN AdminClientSystem
  ON AdminInvoices.AdminId = AdminClientSystem.AdminId
INNER JOIN ClientData
  ON AdminClientSystem.CompanyId = ClientData.CompanyId
GROUP BY CL.CompanyName
ORDER BY CL.CompanyName ASC

提前感谢您的帮助!:)

就我在您的示例中所见,AdminClientSystem有许多冗余条目,因此对于一个adminid,您有几个带有公司id的条目。不确定表中是否真的有这样的数据,或者您只是发布了一些错误的内容。 要仅使用一次,可以使用子查询,如:

 SELECT CL.CompanyName, count([IncentiveId]) 
 FROM AdminInvoices
 INNER JOIN (select distinct AdminId, CompanyId from AdminClientSystem) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData
 ON ACS.CompanyId= ClientData.CompanyId
 GROUP BY CL.CompanyName
 ORDER BY CL.CompanyName ASC

就我在您的示例中所见,AdminClientSystem有许多冗余条目,因此对于一个adminid,您有几个带有公司id的条目。不确定表中是否真的有这样的数据,或者您只是发布了一些错误的内容。 要仅使用一次,可以使用子查询,如:

 SELECT CL.CompanyName, count([IncentiveId]) 
 FROM AdminInvoices
 INNER JOIN (select distinct AdminId, CompanyId from AdminClientSystem) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData
 ON ACS.CompanyId= ClientData.CompanyId
 GROUP BY CL.CompanyName
 ORDER BY CL.CompanyName ASC

就我在您的示例中所见,AdminClientSystem有许多冗余条目,因此对于一个adminid,您有几个带有公司id的条目。不确定表中是否真的有这样的数据,或者您只是发布了一些错误的内容。 要仅使用一次,可以使用子查询,如:

 SELECT CL.CompanyName, count([IncentiveId]) 
 FROM AdminInvoices
 INNER JOIN (select distinct AdminId, CompanyId from AdminClientSystem) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData
 ON ACS.CompanyId= ClientData.CompanyId
 GROUP BY CL.CompanyName
 ORDER BY CL.CompanyName ASC

就我在您的示例中所见,AdminClientSystem有许多冗余条目,因此对于一个adminid,您有几个带有公司id的条目。不确定表中是否真的有这样的数据,或者您只是发布了一些错误的内容。 要仅使用一次,可以使用子查询,如:

 SELECT CL.CompanyName, count([IncentiveId]) 
 FROM AdminInvoices
 INNER JOIN (select distinct AdminId, CompanyId from AdminClientSystem) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData
 ON ACS.CompanyId= ClientData.CompanyId
 GROUP BY CL.CompanyName
 ORDER BY CL.CompanyName ASC
试试这个

 SELECT CL.CompanyName, count([AdminInvoices.InvoiceId]) 
 FROM AdminInvoices 
 INNER JOIN 
 (select distinct(AdminId),CompanyId  
 from AdminClientSystem 
 WHERE CompanyId IN 
 (SELECT DISTINCT CompanyId FROM ClientData)) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData as CL
 ON ACS.CompanyId= CL.CompanyId
 GROUP BY CL.CompanyName
试试这个

 SELECT CL.CompanyName, count([AdminInvoices.InvoiceId]) 
 FROM AdminInvoices 
 INNER JOIN 
 (select distinct(AdminId),CompanyId  
 from AdminClientSystem 
 WHERE CompanyId IN 
 (SELECT DISTINCT CompanyId FROM ClientData)) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData as CL
 ON ACS.CompanyId= CL.CompanyId
 GROUP BY CL.CompanyName
试试这个

 SELECT CL.CompanyName, count([AdminInvoices.InvoiceId]) 
 FROM AdminInvoices 
 INNER JOIN 
 (select distinct(AdminId),CompanyId  
 from AdminClientSystem 
 WHERE CompanyId IN 
 (SELECT DISTINCT CompanyId FROM ClientData)) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData as CL
 ON ACS.CompanyId= CL.CompanyId
 GROUP BY CL.CompanyName
试试这个

 SELECT CL.CompanyName, count([AdminInvoices.InvoiceId]) 
 FROM AdminInvoices 
 INNER JOIN 
 (select distinct(AdminId),CompanyId  
 from AdminClientSystem 
 WHERE CompanyId IN 
 (SELECT DISTINCT CompanyId FROM ClientData)) as ACS
 ON AdminInvoices.AdminId = ACS.AdminId
 INNER JOIN ClientData as CL
 ON ACS.CompanyId= CL.CompanyId
 GROUP BY CL.CompanyName

我认为它是SQL而不是mysql吗?我认为它是SQL而不是mysql吗?我认为它是SQL而不是mysql吗?我认为它是SQL而不是mysql吗,是-AdminClientSystem在前两列中有大量冗余数据,表中的其他列不同。我将在一秒钟内尝试,是-AdminClientSystem在前两列中有大量冗余数据,表中的其他列不同。我将在一秒钟内尝试,是-AdminClientSystem在前两列中有大量冗余数据,表中的其他列有所不同。