尝试获取正确的SQL查询(联接)

时间:2019-02-19 12:51:29

标签: sql

我一直试图连接几个表以获得正确的结果。 问题是它返回了一些NULL值,但实际情况并非如此。

EP.ProductId,CreateDate,IsproductActivated和Subject返回一个Null值。我注意到,当我进行如下所示的正确连接时,DossierID和dossier将返回一个值。 有人可以帮助我处理我的案件吗?

SELECT  
     EP.ProductId                           AS [ProductId]
    ,MAX(EP.CreateDate)                     AS [CreateDate]
    ,EP.IsProductActivated                  AS [IsProductActivated]
    ,PC.EntityId                            AS [DossierID]
    ,PC.EntityDiscriminator                 AS [EntityDiscriminator]
    ,PDCP.Name                              AS [Subject]
    ,D.Name                                 AS [Dossier]

FROM 
[tblEntityProduct] AS EP

LEFT JOIN .tblPDCProduct AS PDCP
    ON  PDCP.id = EP.Productid

LEFT JOIN 
    [tblProductContainerContent] AS PCC
    ON PCC.EntityProductId = EP.ProductId 

RIGHT JOIN 
    [tblProductContainer] AS PC
    ON  PC.Id = PCC.Productcontainerid 

LEFT JOIN
    [tblDossier] AS D
    ON D.Id = PC.Entityid
WHERE PC.EntityId = 2803

    GROUP BY EP.Productid
            ,IsProductActivated 
            ,EntityId 
            ,EntityDiscriminator 
            ,PDCP.name
            ,D.name

The picture below shows the result of the above query. I want the values it suppose to have instead of the NULL

2 个答案:

答案 0 :(得分:0)

使用内部联接避免获取空值,因为LEFT JOIN关键字返回左表(table1)中的所有记录,并返回右表(table2)中的匹配记录。如果不匹配,则结果从右侧为NULL。对于相反的右连接对于左连接是正确的

SELECT  
     EP.ProductId                           AS [ProductId]
    ,MAX(EP.CreateDate)                     AS [CreateDate]
    ,EP.IsProductActivated                  AS [IsProductActivated]
    ,PC.EntityId                            AS [DossierID]
    ,PC.EntityDiscriminator                 AS [EntityDiscriminator]
    ,PDCP.Name                              AS [Subject]
    ,D.Name                                 AS [Dossier]

FROM 
[tblEntityProduct] AS EP

 JOIN .tblPDCProduct AS PDCP
    ON  PDCP.id = EP.Productid

 JOIN 
    [tblProductContainerContent] AS PCC
    ON PCC.EntityProductId = EP.ProductId 

 JOIN 
    [tblProductContainer] AS PC
    ON  PC.Id = PCC.Productcontainerid 

 JOIN
    [tblDossier] AS D
    ON D.Id = PC.Entityid
WHERE PC.EntityId = 2803

    GROUP BY EP.Productid
            ,IsProductActivated 
            ,EntityId 
            ,EntityDiscriminator 
            ,PDCP.name
            ,D.name

答案 1 :(得分:0)

我讨厌右联接。他们基本上是一个需要此表,而与导致它的其他表无关。相反,我反转了查询以将REQUIRED表放在第一个位置,然后将LEFT-JOIN放在基础上。现在,基于结构/连接,我想您从产品容器开始的想法将永远存在。每个产品容器中都有东西(ProductContainerContent)。然后,每个内容项都是一个实体产品以获取其描述。每个容器都有自己的档案,可以在准备容器时分配(或不分配)。如果我是正确的话,大多数LEFT-JOIN应该只是标准(内部)JOIN,但是让我们看看这对您的数据有何作用。

SELECT
        EP.ProductId,
        MAX(EP.CreateDate) CreateDate,
        EP.IsProductActivated,
        PC.EntityId DossierID,
        PC.EntityDiscriminator,
        PDCP.Name Subject,
        D.Name Dossier
    FROM 
        tblProductContainer PC
            LEFT JOIN tblProductContainerContent PCC
                ON  PC.Id = PCC.Productcontainerid 
                LEFT JOIN tblEntityProduct EP
                    ON PCC.EntityProductId = EP.ProductId
                    LEFT JOIN tblPDCProduct PDCP
                        ON  EP.Productid = PDCP.id
            LEFT JOIN tblDossier D
                ON PC.Entityid = D.Id
    WHERE 
        PC.EntityId = 2803
    GROUP BY 
        EP.Productid,
        IsProductActivated,
        EntityId,
        EntityDiscriminator,
        PDCP.name,
        D.name