我有一个SQL命令来获取项目编号,项目标题,员工姓名&来自数据库的数字。
SELECT
DOS.NUMFOLDER as ProjectNumber,
DOS.DESCRIPTION as ProjectTitle,
EMP.NUMEMPL as EmployeeNumber,
EMP.EMPLNAME+ ' ' + EMP.EMPLSURNAME as EmployeeName
FROM DOSEMPDT DEM
INNER JOIN DOSSIER DOS ON DEM.SEQCONTRAT = DOS.SEQCONTRAT
INNER JOIN EMPLOYE EMP ON DEM.SEQEMPLOYE = EMP.SEQEMPLOYE
--INNER JOIN BILLING BIL ON DEM.SEQCONTRAT = FAC.SEQCONTRAT
WHERE (DEM.DATEFINAFF IS NULL OR DEM.DATEFINAFF > GETDATE())
AND (DOS.DATEFIN IS NULL OR DOS.DATEFIN > GETDATE())
--AND FAC.DTBILLING IS NOT NULL
--AND FAC.DTBILLING >= DATEADD(mm, -1, GETDATE())
ORDER BY NoProjet
这给了我想要的东西;包含项目编号,项目标题和员工的表。预期的结果看起来有点像这样:
projectA *titlea* 1111 Jim
projectA *titlea* 2222 James
projectB *titleb* 1111 Jim
projectB *titleb* 3333 Paul
但我想在结果中添加一个过滤器。我仍然希望看到同一项目的多个实例,以及相关的员工,但我想只看到某些项目;那些BILLING
日期不到一个月的人,而不显示BILLING
。
删除INNER JOIN BILLING
之前的注释会使结果重复多次,可能是因为许多项目有很多BILLING
,但我不知道如何避免这种情况。我认为这个问题存在于我的第3个INNER JOIN
,我尝试了LEFT JOIN
,RIGHT JOIN
等等......但无济于事。
答案 0 :(得分:1)
我相信您只是显示重复数据。
事实上,发票表将包含合同序号以及相对发票ID。例如
Project A Invoice_001
Project A Invoice_002
使用您当前的SELECT,您将永远得到:
projectA *titlea* 1111 Jim
projectA *titlea* 2222 James
projectB *titleb* 1111 Jim
projectB *titleb* 3333 Paul
但是,如果您在SELECT中添加发票列,您可能会得到:
projectA *titlea* 1111 Jim Invoice_001
projectA *titlea* 1111 Jim Invoice_002
projectA *titlea* 2222 James Invoice_003
projectB *titleb* 1111 Jim Invoice_004
projectB *titleb* 3333 Paul Invoice_005
所以,不再有重复的数据!
我希望这会有所帮助。
答案 1 :(得分:0)
您可以使用exists
执行所需操作:
SELECT . . .
FROM DOSEMPDT DEM INNER JOIN
DOSSIER DOS
ON DEM.SEQCONTRAT = DOS.SEQCONTRAT INNER JOIN
EMPLOYE EMP
ON DEM.SEQEMPLOYE = EMP.SEQEMPLOYE
WHERE (DEM.DATEFINAFF IS NULL OR DEM.DATEFINAFF > GETDATE()) AND
(DOS.DATEFIN IS NULL OR DOS.DATEFIN > GETDATE()) AND
EXISTS (SELECT 1
FROM FACTURE FAC
WHERE DEM.SEQCONTRAT = FAC.SEQCONTRAT AND
FAC.DTFACTURE IS NOT NULL AND
FAC.DTFACTURE >= DATEADD(month, -1, GETDATE())
)