Sql 使用内部联接获取不同的记录

Sql 使用内部联接获取不同的记录,sql,sql-server,database,sql-server-2008,tsql,Sql,Sql Server,Database,Sql Server 2008,Tsql,我有关于多个表的查询 SELECT DISTINCT b.BoxBarcode as [Box Barcode], (select case when b.ImagesCount IS NULL then 0 else b.ImagesCount end) as [Total Images], s.StageName as [Current Stage] ,d.DocuementTypeName as [Document Type], u

我有关于多个表的查询

SELECT DISTINCT b.BoxBarcode as [Box Barcode], (select case when  b.ImagesCount IS NULL
        then 0 
        else  b.ImagesCount end) as [Total Images], s.StageName as [Current   Stage] ,d.DocuementTypeName as [Document Type],
        u.UserName as [Start User],uu.UserName as [Finished User]

FROM [dbo].[Operations] o
    inner join dbo.LKUP_Stages s on 
        o.stageid=s.id
    inner join dbo.LKUP_Users u on
        u.id=o.startuserid
    left join dbo.LKUP_Users uu on
        uu.id=o.FinishedUserID
    inner join boxes b on
        b.id=o.boxid
    inner join LKUP_DocumentTypes d on
        d.ID = b.DocTypeID 

where b.IsExportFinished = 0
当我从box表中选择count时,其中
IsExportFinished=0
我有42条记录,当我运行上面的qoury时,我有71条记录,
我只想检索Boxes表中的42条记录。

我想如果您将左连接更改为内部连接,您将根据请求获得42条记录。

您正在进行一对多连接,即至少有一个表具有多个符合连接条件的行

第一步是找出给出“重复项”的表

完成此操作后,您可以通过向联接添加其他条件来解决问题。我猜测相同的
boxid
操作
表中会出现多次。如果是这种情况,您需要决定要选择哪个
操作
行,然后相应地更新SQL。

试试这个-

SELECT
      Box_Barcode = b.BoxBarcode
    , Total_Images = ISNULL(b.ImagesCount, 0)
    , Current_Stage = s.StageName
    , Document_Type = d.DocuementTypeName
    , Start_User = u.UserName
    , Finished_User = uu.UserName
FROM (
    SELECT DISTINCT 
          o.stageid
        , o.boxid
        , o.startuserid
        , o.FinishedUserID
    FROM dbo.[Operations]
) o
JOIN dbo.LKUP_Stages s ON o.stageid = s.id
JOIN dbo.boxes b ON b.id = o.boxid
JOIN dbo.LKUP_DocumentTypes d ON d.id = b.DocTypeID
JOIN dbo.LKUP_Users u ON u.id = o.startuserid
LEFT JOIN dbo.LKUP_Users uu ON uu.id = o.FinishedUserID
WHERE b.IsExportFinished = 0

您要加入的其中一个表的每个框可能有更多记录。请使用“从框中选择*进行查询…”。。。然后找出哪个连接与结果集相乘。我猜操作框是1对多关系。每个框可以有多个阶段(因此阶段名称)?您正在包括来自阶段(以及操作表)的值。是的,亲爱的,方框经过多个阶段,方框一次经过一次阶段。同样亲爱的,select return 71记录它必须返回46 justyes,您是对的,我在where条件中添加了操作表,其中StageID=1,其工作正常。非常感谢。