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,其工作正常。非常感谢。