2013-06-16 2 views
0

Я использую SQL Server 2012. У меня есть магазин, где разные продавцы размещают свои товары. Различные продавцы могут размещать одинаковые товары. Например. Два продавца могут разместить «iPhone» в качестве статьи. Мне нужно найти уникальные товары в магазине. У меня есть две таблицы:Выбор неповторимых предметов со ссылок

  1. ArticlePlacedBySeller {Id, описание, ...}
  2. LinkBetweenArticles {Id, ст.1,}
  3. Статья 2

Например, если три продавцы помещают «iPhone» и «iPhone 2» мы увидим:

Art iclePlacedBySeller: {Id: , Описание: 'iPhone super'}; {, 'iPhone best'}; {, 'iPhone new brand'}; {, 'iPhone 2'}

LinkBetweenArticles: {Id: 1, Article1: , Статья 2: }; {2, 2, 1}; {3, 2, 3}; {4, 3, 2}; {5, 3, 1}; {6, 1, 3};

Как вы видели, только первые три изделия связаны между собой. Четвертая статья: не привязана. Теперь нам нужно выбрать только один (независимо от того, что именно) из этих 3 товаров от ArticlePlacedBySeller и 1 не связано по части описания (, где Описание like '% ...%'). (Результат этого сценария должны быть:

ArticlePlacedBySeller: Id: , Id:.

(два лица)

Here is a script

Может вы предлагаете SQL-запрос, чтобы сделать это?

P.S. Не предлагайте изменить структуру БД и добавить таблицу UniqueArticle. Я не могу этого сделать, и это не полезно, потому что очень динамично меняют товары в магазине.

ответ

2

Что-то вроде этого будет работать для конкретного случая, но может потребоваться дополнительное тестирование на более крупные данные образца. Он также предполагает, что ваши ссылки всегда будут двунаправленными.

;WITH CTE_Links AS 
(
    SELECT Article1, MIN(Article2) Article2 
    FROM dbo.LinkBetweenArticles 
    GROUP BY Article1 
    HAVING Article1 > MIN(Article2) 
) 
SELECT a.* 
FROM dbo.ArticlePlacedBySeller a 
LEFT JOIN CTE_Links l ON a.Id = l.Article1 
WHERE l.Article2 IS NULL 

SQLFiddle Demo

Demo with few more articles

Смежные вопросы