1

I have tow tables Requisitions and RequisitionDetails

Requisitions table

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

RequisitionDetails table

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

I am trying to get Requisition data where Quantity is not equal to ReceivedQuantity.

i have tried the below query but its record with RequisitionID 1 twice.

How can i make the query returns the Requisition data without repeating the requisition data based on items that have Quantity is not equal to 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

3 Answers 3

2

It's returning twice because of the two rows with RequistionID = 1 in the RequistionDetails table. Since the rows returned are exact duplicates you can simply add the DISTINCT keyword to your select to see one of them:

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

You should also use some aliases to clean up your query:

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
Sign up to request clarification or add additional context in comments.

Comments

2

You also can use exists for your case

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

Comments

2

As you don't need columns from the 2nd table you can also switch to EXISTS to avoid 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
 )

Or IN:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.