SQL-запрос выбрать из таблицы и группы на другой столбец - PullRequest
0 голосов
/ 19 февраля 2011

Я плохо формулирую название вопроса, так как не знаю, как назвать то, что пытаюсь сделать, но на самом деле все должно быть просто.

У меня есть таблица ссылок / соединений с двумя столбцами идентификаторов. Я хочу выполнить проверку перед сохранением новых строк в таблице.

Пользователь может сохранять атрибуты через веб-страницу, но мне нужно проверить, что такой же комбинации не существует, прежде чем сохранять ее. С одной записью это легко, так как, очевидно, вы просто проверяете, присутствует ли этот attributeId в таблице, если это не позволяет им сохранить его снова.

Однако, если пользователь выбирает комбинацию этого атрибута и другого, ему следует разрешить сохранить его.

Вот изображение того, что я имею в виду:

enter image description here

Так что, если пользователь сейчас попытается сохранить атрибут с идентификатором 1, он остановит их, но мне нужно также остановить их, если они попробовали идентификаторы 1, 10, если оба 1 и 10 имели одинаковый productAttributeId.

Я путаю это в своем объяснении, но я надеюсь, что изображение прояснит, что мне нужно сделать.

Это должно быть просто, поэтому я предполагаю, что что-то упустил.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2011

Вы можете управлять своими вставками с помощью хранимой процедуры.Насколько я понимаю,

  1. пользователи могут выбрать комбинацию атрибутов, например
    • просто 1
    • 1 и 10 вместе
    • 1,4, 5,10 (4 атрибута)

Они должны входить в таблицу как один "пакет" против (нового?) ProductAttributeId

Так что если(1,10) было выбрано, его нужно заблокировать, поскольку 1-2 и 10-2 уже существуют.

Что я предлагаю

Хранимая процедура должна принимать атрибуты в виде одного спискаНапример, '1,2,3' (через запятую, без пробелов, только целые числа)

Затем можно использовать UDF с разделением строк или встроенный трюк XML (как показано ниже), чтобы разбить его на строкипроизводная таблица.

Тестовая таблица

create table attrib (attributeid int, productattributeid int)
insert attrib select 1,1
insert attrib select 1,2
insert attrib select 10,2

Здесь я использую переменную, но вы можете включить в качестве входного параметра SP

declare @t nvarchar(max) set @t = '1,2,10'

select top(1)
  t.productattributeid,
  count(t.productattributeid) count_attrib,
  count(*) over () count_input
from (select convert(xml,'<a>' + replace(@t,',','</a><a>') + '</a>') x) x
cross apply x.x.nodes('a') n(c)
cross apply (select n.c.value('.','int')) a(attributeid)
left join attrib t on t.attributeid = a.attributeid
group by t.productattributeid
order by countrows desc

Выход

productattributeid     count_attrib     count_input
2                      2                3
  1. 1-й столбец дает вам productattributeid с наибольшим количеством совпадений
  2. 2-й столбец показывает, сколько атрибутов было найденоспойте один и тот же productattributeid
  3. В 3-м столбце указано, сколько атрибутов существует во входных данных

Если вы сравните последние 2 столбца и количество совпадений

  1. - вы можете использовать productattributeid для присоединения к продукту, у которого все эти атрибуты
  2. не совпадают - тогда вам нужно сделать вставку для создания новой комбинации
0 голосов
/ 19 февраля 2011

Если я правильно понимаю вопрос, вы хотите предотвратить повторное использование комбинации AttributeId и ProductAttributeId.Если это так, просто сделайте их комбинированным первичным ключом, который по своей природе UNIQUE.

Если это невозможно, создайте хранимую процедуру, которая запускает запрос к объединению для экземпляров AttributeId,Если запрос возвращает 0 экземпляров, вставьте строку.

Вот небольшой код для представления идеи (может потребоваться изменить ее для работы с вашей базой данных):

SELECT COUNT(1) FROM MyJoinTable WHERE AttributeId = @RequestedID
IF @@ROWCOUNT = 0
BEGIN
   INSERT INTO MyJoinTable ...
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...