Я пытаюсь создать SQL-запрос, который может группироваться по уникальным отношениям «многие ко многим». У меня есть таблица Event, которая может иметь 1 или более художников. Я хотел бы сгруппировать события , но, только если у них нет одинакового состава (точно такие же исполнители). Если они имеют точно такой же состав, я бы хотел получить только самое новое событие (= Дата события).T-SQL Группировка по уникальным отношениям «многие-ко-многим»
После некоторого расследования кажется, что это нужно будет сделать с использованием внешнего применения, но я действительно не могу понять это.
UPDATE
Я бы необходима отдельные строки для каждого художника, каждое события, в наборе результатов, как описано в таблице ожидаемого результата. Они (или идентификатор художника) не должны быть объединены в одном поле.
UPDATE 2
я получил следующий запрос, чтобы сделать то, что я бы обязательно, но СУЩЕСТВУЕТ условие имеет низкую производительность. Может ли это быть переписано более успешно?
Примечание: Операторы SQL, которые используют условие EXISTS, очень неэффективны, так как подзапрос RE-RUN для КАЖДОЙ строки в таблице внешнего запроса. Существуют более эффективные способы написания большинства запросов, которые не используют условие EXISTS.
SELECT E.*
FROM [Events] AS E
WHERE EXISTS(
SELECT NULL AS [EMPTY]
FROM [Headliners] AS H
WHERE H.[EventId] = E.[EventId]
)
AND NOT EXISTS(
SELECT NULL AS [EMPTY]
FROM [Events] AS E2
WHERE E2.[Date] < E.[Date]
AND NOT EXISTS(
SELECT NULL AS [EMPTY]
FROM [Headliners] AS H1
WHERE NOT EXISTS(
SELECT NULL AS [EMPTY]
FROM [Headliners] AS [t4]
WHERE [t4].[EventId] = E.[EventId]
AND CASE WHEN [t4].[ArtistId] <> H1.[ArtistId] THEN 1 ELSE 0 END = 0)
AND H1.[EventId] = E2.[EventId])
AND NOT EXISTS(
SELECT NULL AS [EMPTY]
FROM [Headliners] AS H2
WHERE NOT EXISTS(
SELECT NULL AS [EMPTY]
FROM [Headliners] AS [t6]
WHERE [t6].[EventId] = E2.[EventId]
AND CASE WHEN [t6].[ArtistId] <> H2.[ArtistId] THEN 1 ELSE 0 END = 0)
AND H2.[EventId] = E.[EventId]
)
)
Ожидаемый результат
x-----------x---------x------------x----------x
| EventId | Name | Date | ArtistId |
x-----------x---------x------------x----------x
| 1 | E1 | 2016-01-01 | 1 |
| 1 | E1 | 2016-01-01 | 2 |
| 2 | E2 | 2016-01-02 | 3 |
| 4 | E4 | 2016-01-04 | 5 |
| 4 | E4 | 2016-01-04 | 6 |
| 5 | E5 | 2016-01-05 | 4 |
| 6 | E6 | 2016-01-06 | 5 |
x-----------x---------x------------x----------x
Схема
Таблица событий
x-----------x---------x------------x
| EventId | Name | Date |
x-----------x---------x------------x
| 1 | E1 | 2016-01-01 |
| 2 | E2 | 2016-01-02 |
| 3 | E3 | 2016-01-03 |
| 4 | E4 | 2016-01-04 |
| 5 | E5 | 2016-01-05 |
| 6 | E6 | 2016-01-06 |
| 7 | E7 | 2016-01-07 |
| 8 | E8 | 2016-01-08 |
x-----------x---------x------------x
Headliner стол
x-----------x-------------x
| EventId | ArtistId |
x-----------x-------------x
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
| 3 | 2 |
| 3 | 1 |
| 4 | 5 |
| 4 | 6 |
| 5 | 4 |
| 6 | 5 |
| 8 | 3 |
x-----------x-------------x
Исполнитель стол
x------------x---------x--------------x
| ArtistId | Name | Bio |
x------------x---------x--------------x
| 1 | A1 | BIO1 |
| 2 | A2 | BIO2 |
| 3 | A3 | BIO3 |
| 4 | A4 | BIO4 |
| 5 | A5 | BIO5 |
| 6 | A6 | BIO6 |
x------------x---------x--------------x
... a 404 страница ошибки? –
Я думаю, что ваши данные о выборке и результатах несовместимы с EventId 7 и 8 –
@PhilipKelley Я не вижу несогласованности. Событие 7 не имеет хедлайнеров, а 8 имеет 1 headliner (artist id = 3), но это дубликат eventid 2. – Frank