Ограничение записей одной стороной соединения в запросе на самосоединение

Рассмотрим таблицу (имя Term) следующим образом:

[Id] [int] IDENTITY(1,1) NOT NULL,
[CategoryId] [int] NOT NULL,
[Label] [nvarchar](256) NOT NULL,
[Uri] [nvarchar](1024) NOT NULL

Теперь представьте, что определены две категории: CategoryId 1 и CategoryId 2, и есть несколько терминов, принадлежащих либо к категории 1, либо к категории 2. Я пытаюсь найти термины, которые имеют один и тот же URI, но разные метки в этих двух категориях или в одной категории из этих двух. Для этого я попытался написать SQL с самообъединением:

SELECT
    t1.Id AS TermId1,
    t2.Id AS TermId2
FROM
    Term t1 INNER JOIN Term t2 ON t1.Uri = t2.Uri
WHERE
    t1.CategoryId IN (@CategoryId1, @CategoryId2) AND
    t2.CategoryId IN (@CategoryId1, @CategoryId2) AND
    t1.Label <> t2.Label

Это прекрасно работает, но каждая строка возвращается дважды... Например,

TermId1, TermId2 TermId2, TermId1

Если termId1 отличается от termId2, то нет необходимости иметь результат в обратном порядке. Итак, как я должен получить результаты один раз?

Спасибо за помощь,


person Joe Bank    schedule 28.09.2011    source источник


Ответы (1)


Попробуйте это. Возможно, вам не нужна группа

    SELECT t1.Id AS TermId1, t2.Id AS TermId2
    FROM
        Term t1 
        INNER JOIN Term t2 
          ON t1.Uri = t2.Uri
         AND t1.Label <> t2.Label
         AND t1.Id < t2.Id      
    WHERE
            t1.CategoryId IN (@CategoryId1, @CategoryId2) 
        and t2.CategoryId IN (@CategoryId1, @CategoryId2)          
    group by t1.Id, t2.Id
    order by t1.Id, t2.Id
person paparazzo    schedule 28.09.2011