Как получить правильный результат SQL в сложном SQL с 4 таблицами - PullRequest
0 голосов
/ 26 сентября 2018

У нас есть SQL-запрос, в котором мы используем 3 внутренних соединения и массивно-сложное условие where.У нас есть следующие 4 таблицы:
Таблица 1: Avis - это 1: n к таблице 2 (привязано к Avis.Id = Item.AvisFk)
Таблица 2: Item - это 1: n ктаблица 3 (привязана к Item.Id = Routesection.ItemFk)
Таблица 3: Routesection - это: от 1 до таблицы 4 (привязана к Routesection.TourFk = Tour.Id)
Таблица 4: Тур

Теперь мы используем условие WHERE, где мы фильтруем некоторые даты, местоположения и так далее.Теперь у нас есть проблема, заключающаяся в том, что есть некоторые особые идентификаторы предметов, которые мы не хотим иметь.Мы получаем неправильные результаты.Существуют Avis, которые имеют много предметов.Теперь мы хотим отфильтровать ВСЕ Avis, у которых есть хотя бы один из нежелательных элементов.Но из Tour-Query.

Я попробовал это с WHERE (SELECT Count(*) FROM Item WHERE OemFk=5003 AND AvisFK = Avis.Id) = 0 Но мы должны использовать несколько GROUP BY, и там мы группируем все Avis в один тур. Чтобы мы каждый раз получали «true»,потому что в этом туре есть некоторые Avis, у которых есть нежелательный предмет, а некоторые нет ...

Кто-нибудь знает, как я могу решить эту проблему?

РЕДАКТИРОВАТЬ: Хорошо, я пытаюсьчтобы дать вам основную, что я действительно имею в виду.Допустим, у нас есть 2 строки данных в Avis.Ряды: ID;(только то, что действительно нужно)
1;
2;
Тогда, допустим, у нас есть несколько предметов в Item.Ряды: ID;AvisFk;OemFk;
1; 1; 5001;
2; 1; 5002;
3; 2; 5003;
4; 2; 5004;
Затем Routesection (немного больше строк, я приведу здесь только некоторые для справкипример).Ряды: ID;ItemFk;TourFk;
1; 1; 1;
2; 1; 1;
3; 2; 1;
4; 2; 1;
5; 3; 2;
6; 3; 2;
7; 4; 3;
8; 4; 3;
Наконец, но не в последнюю очередь Тур.Строки: ID;
1;
2;
3;
Хорошо, теперь я хочу запросить таблицу Tour.Результатом должен быть только Тур 1. Желательным результатом было бы получение туров, в которых внутреннее соединение на других таблицах не имеет отношения к специальному условию.Условие таково: если у предмета есть OemFk 5003, тогда ВСЕ предметы, принадлежащие одному и тому же Avis (в данном случае 3 и 4), должны быть отфильтрованы.SELECT ссылается почти на 40 столбцов, а WHERE включает еще 5 условий, и каждый столбец в SELECT также находится внутри GROUP BY, поэтому я попытался показать только необходимый минимум, а не полный запрос.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

@ Катон был прав, к сожалению, я не мог пометить его как правильный ответ, потому что это был всего лишь комментарий.
Мне удалось получить правильные результаты с помощью оператора WITH.Сначала я отфильтровал таблицы в объединенном INNER JOIN по всем 4 таблицам, выбрал НЕ желаемые результаты в качестве «черного списка» и использовал его с помощью LEFT JOIN, чтобы выбрать из тура все результаты, которых не было в результате WITH.
Теперь это выглядит примерно так:

WITH partresult AS
(SELECT TourFk
 FROM Routesection r
 INNER JOIN Item i ON r.ItemFk=i.ID
 INNER JOIN Avis a ON a.ID=i.AvisFk
 INNER JOIN Tour t ON r.TourFk=t.ID
 WHERE (put some strange selections here ;)
        AND i.OemFk=5003)
SELECT t.ID, etc.
FROM Tour t
INNER JOIN Routesection r ON t.ID=r.TourFk
INNER JOIN Item i ON i.ID=r.ItemFk
INNER JOIN Avis a ON a.ID=i.AvisFk
LEFT JOIN partresult p ON t.ID=p.TourFk
WHERE p.TourFK IS NULL
      AND (nearly the same selections as above, so the server is a little bit faster)
GROUP BY t.ID, etc.
0 голосов
/ 26 сентября 2018

... есть некоторые Avis в этом туре, у которых есть нежелательный предмет, а некоторые нет ...

У кого-нибудь есть идеи, как мне решить эту проблему?

Изучите использование ГДЕ СУЩЕСТВУЕТ ().

...