2016-08-19 4 views
1

У меня есть таблицы буксирные Requisitions и RequisitionDetailsВыбрать запрос 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 дважды.

Как я могу заставить запрос возвращать данные заявки без повторения данных заявки на основе элементов, количество которых не равно принятому запросу.

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

Это возвращение в два раза из-за двух строк с RequistionID = 1 в RequistionDetails таблице. Так как строки возвращаются точные дубликаты вы можете просто добавить 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 
)