2016-08-19 8 views
1

を登録しようRequisitionsRequisitionDetails選択クエリINNERは、私が牽引テーブルを持っている問題

依頼表

+---------------+-----------------+ 
| 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でそのレコードを2回試しました。

Quantityが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

それはRequistionDetailsテーブルであるためRequistionID = 1を持つ2つの列の倍返しです。返される行は、あなたは、単にそれらのいずれかを見るためにあなたの選択に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

あなたはあなたは第二のテーブルから列を必要としないとして、あなたはまた、を避けるためにEXISTSに切り替えることができます

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

も使用することができますあなたのケースのために存在します:

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 
) 
関連する問題