2016-08-19 70 views
1

我拖表RequisitionsRequisitionDetails选择查询INNER JOIN问题

申请表

+---------------+-----------------+ 
| RequisitionID | RequisitionDate | 
+---------------+-----------------+ 
|    1 | 2016-08-17  | 
|    2 | 2016-08-18  | 
|    3 | 2016-08-19  | 
+---------------+-----------------+ 

RequisitionDetails表

+---------------------+---------------+--------+----------+------------------+ 
| RequisitionDetailID | RequisitionID | ItemID | Quantity | ReceivedQuantity | 
+---------------------+---------------+--------+----------+------------------+ 
|     1 |    1 |  1 |  2 |    1 | 
|     2 |    1 |  2 |  3 |    2 | 
|     3 |    2 |  3 |  4 |    3 | 
+---------------------+---------------+--------+----------+------------------+ 

我试图让申请数据,其中数量不等于ReceivedQuantity。

我已经尝试了下面的查询,但它的记录是RequisitionID 1两次。

如何使查询返回申请单数据而不重复申请单数据基于数量不等于ReceivedQuantity的项目。

SELECT 
    dbo.Requisitions.RequisitionID, 
    dbo.Requisitions.RequisitionDate 
FROM dbo.Requisitions 
INNER JOIN dbo.RequisitionDetails 
    ON dbo.Requisitions.RequisitionID = dbo.RequisitionDetails.RequisitionID 
where dbo.RequisitionDetails.Quantity != dbo.RequisitionDetails.ReceivedQuantity 

回答

2

它在RequistionDetailsRequistionID = 1返回,因为两行的两倍。由于返回的行是准确的重复,你可以在DISTINCT关键字简单地添加到您的选择,看看他们中的一个:

SELECT DISTINCT 
dbo.Requisitions.RequisitionID, 
dbo.Requisitions.RequisitionDate 
FROM dbo.Requisitions 
INNER JOIN dbo.RequisitionDetails 
ON dbo.Requisitions.RequisitionID = dbo.RequisitionDetails.RequisitionID 
where dbo.RequisitionDetails.Quantity!= 
dbo.RequisitionDetails.ReceivedQuantity 

你还应该使用一些别名来清理你的查询:

SELECT DISTINCT 
      R.RequisitionID, 
      R.RequisitionDate 
FROM  dbo.Requisitions R 
INNER JOIN dbo.RequisitionDetails RD ON R.RequisitionID = RD.RequisitionID 
WHERE  RD.Quantity != RD.ReceivedQuantity 
2

你也可以使用存在的情况下

select 
* from requistions rq where exists(
select 1 from RequisitionDetails rd where rd.RequisitionID=rq.RequisitionID 
and rd.Quantity!=rd.ReceivedQuantity) 
2

因为你不从第2表列需要你还可以切换到EXISTS避免DISTINCT

SELECT req.* 
FROM dbo.Requisitions as req 
WHERE EXISTS 
(SELECT * FROM dbo.RequisitionDetails as req_det 
    WHERE req.RequisitionID = req_det.RequisitionID 
     AND Quantity <> ReceivedQuantity 
) 

或者IN

SELECT req.* 
FROM dbo.Requisitions 
WHERE RequisitionID IN 
(SELECT RequisitionID 
    FROM dbo.RequisitionDetails 
    WHERE Quantity <> ReceivedQuantity 
)