Сгруппируйте набор данных и найдите нужные данные

Хорошо, сценарий таков, у меня есть таблица Bubble в базе данных следующим образом:

[IMAGE_ID] [int] NOT NULL,
[X] [nchar](4) NOT NULL,
[Y] [nchar](4) NOT NULL,
[WIDTH] [nchar](4) NOT NULL,
[HEIGHT] [nchar](4) NOT NULL,
[TEXT] [nvarchar](max) NULL,
[USER_ID] [int] NOT NULL,
[DATE] [datetime] NOT NULL

Пользователь может вставить n пузырьков для изображения. Я выбираю все пузырьки для изображения в сведениях об изображении, так как буду перечислять их как записи. Теперь мне нужно сгруппировать эти результаты и найти способ поместить 1 изображение для каждого пользователя, но при этом вставить все пользовательские пузыри на изображение. Я не мог придумать хороший способ сделать это.

Должен ли я делать 2 выбора: (1 отдельный imageId + userId для подсчета изображений) и (1 обычный выбор для пузырьков)?

Спасибо


person Pabuc    schedule 10.02.2011    source источник
comment
Вы изучали LINQ to SQL? Это значительно упростило бы эту задачу (если вы укажете PK и FK в своей схеме).   -  person Guillaume86    schedule 10.02.2011
comment
Я не буду использовать ORM для этого проекта, так что это не вариант.   -  person Pabuc    schedule 10.02.2011


Ответы (1)


Это возможно с помощью рекурсивного Common Table Expression. Первая часть CTE подберет запись на основе image_id. Затем эту информацию можно использовать для фильтрации данных, которые соответствуют USER_ID, но не соответствуют IMAGE_ID (поскольку эта запись уже возвращена первой частью запроса).

;WITH bub (IMAGE_ID, X, Y, WIDTH, HEIGHT, TEXT, USER_ID, DATE)
AS ( SELECT IMAGE_ID, X, Y, WIDTH, HEIGHT, TEXT, USER_ID, DATE
     FROM Bubble
     WHERE IMAGE_ID = @image_id
     UNION 
     SELECT b.IMAGE_ID, b.X, b.Y, b.WIDTH, b.HEIGHT, b.TEXT, b.USER_ID, b.DATE
     FROM Bubble b
     JOIN bub bb
       ON b.USER_ID = bb.USER_ID
      AND b.IMAGE_ID <> bb.IMAGE_ID)
SELECT * FROM bub

Примечание. ; перед WITH обязателен. Необходимо завершить предыдущий оператор с помощью ; перед вашим общим табличным выражением. Помещение ; перед WITH менее подвержено ошибкам.

person Filip De Vos    schedule 30.03.2011