SQL хочет вернуть только одну строку для каждой заметки - PullRequest
1 голос
/ 07 сентября 2010

У меня есть следующие таблицы: Заказы, Заметки, Разрешения

В каждой таблице есть следующие столбцы:

Orders = ID
Notes = ID, RelatedID, Note, Timestamp
Permits = ID, OrderId

У меня есть следующий запрос

SELECT o.id
     , op.id
     , n.timestamp
  FROM [tblOrders] o
INNER JOIN [tblNotes] n ON n.[RelatedID] = o.[ID]
INNER JOIN [tblPermits] op ON o.[id] = op.[OrderID]
     WHERE n.[Text] LIKE 'Line item is created%'

В заказе есть от 1 до многих разрешений, а в заказе от 1 до многих нот

Проблема здесь в том, что примечания относятся к заказу, а не к индивидуальному разрешению, поэтому при присоединении o.id с n.relatedID, еслив заказе более 1 разрешения, в действительности он будет показывать 4 записи вместо 2, поскольку он соединяется дважды для каждого разрешения, поскольку orderID одинаков.Как я могу получить это, чтобы вернуть только 2 записи?

Ответы [ 3 ]

4 голосов
/ 07 сентября 2010

Проблема в том, что при использовании JOINs возникает риск дублирования в наборе результатов, поскольку для каждой вспомогательной записи в tblnotes будет запись.Моя первая рекомендация - переписать, чтобы вы не использовали JOIN:

Использование EXISTS:

SELECT o.id,
       p.id
  FROM tblorders o
  JOIN tblpermits p ON p.orderid = o.id
 WHERE EXISTS(SELECT NULL
                FROM tblnotes n 
               WHERE n.[Text] LIKE 'Line item is created%'
                 AND n.relatedid = o.id)

Использование IN:

SELECT o.id,
       p.id
  FROM tblorders o
  JOIN tblpermits p ON p.orderid = o.id
 WHERE o.id IN (SELECT n.relatedid
                  FROM tblnotes n 
                WHERE n.[Text] LIKE 'Line item is created%')
0 голосов
/ 07 сентября 2010
SELECT  o.id ,op.id
FROM    [tblOrders] o
JOIN    [tblPermits] op
ON      op.[OrderID] = o.[id]
WHERE   o.id IN
        (
        SELECT  n.[RelatedID]
        FROM    tblNotes n
        WHERE   n.[Text] LIKE 'Line item is created%'
        )
0 голосов
/ 07 сентября 2010

Один путь будет

SELECT DISTINCT
o.id
,op.id
.....
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...