Присоединяйтесь к таблице, только если набор результатов> 0 - PullRequest
0 голосов
/ 10 января 2011

У меня есть таблица A, соединенная с таблицей B, которая дает мне набор результатов.Я хочу объединить таблицу C с предыдущими, чтобы ограничить набор результатов.Но в случае, если в этом соединении нет результата, я хотел бы иметь тот же набор результатов, что и раньше (без учета C).

Можете ли вы придумать способ сделать это в SQL?

Ответы [ 3 ]

2 голосов
/ 10 января 2011
SELECT *
FROM TableA
INNER JOIN TableB
    ON TableA.ID = TableB.TableAID
LEFT JOIN TableC
    ON TableC.ID = TableB.TableCID

Это вернет все строки из таблиц A и B, но только те строки из TableC, где совпадают критерии ON.

В противном случае условные объединения не применяются в стандартном SQL.Если вы используете SQL Server, вы можете выполнить некоторую логику хранимых процедур, чтобы проверить результаты из TableC, а если их нет, получить данные только из таблиц A и B. Но этот подход зависит от поставщика

1 голос
/ 10 января 2011

Невозможно с обычным SQL, поскольку в нем используется логика.

Лучше всего сделать небольшой скрипт, например (в псевдокоде)

select * into #tmp from x inner join y inner join z where blabla;
if (exists (select * from #tmp))
BEGIN
  select * from #tmp
END
else
BEGIN
   select * from x inner join y where blabla;
END

Редактировать:

Но на вашем месте я бы всегда соединялся с C, используя LEFT JOIN, чтобы вы могли видеть, был ли результат в том или ином наборе результатов ...

например

select x.*, y.*, case when z.id is null then 0 else 1 end from x inner join y left join z on blabla where blabla;

Но это, конечно, предполагает, что вы можете изменить путь к коду, который читает результат.

0 голосов
/ 10 января 2011

Я вижу проблему в методах LEFT / OUTER JOIN.Если вы сделаете это, вы можете получить некоторые результаты, которые находятся в A и B, но не в C. Если я хорошо понимаю, что porpouse является соединением AB с C, я имею в виду результат, когда пересечение с C должно включать три ограничения.Таким образом, решение @Cine является подходящим для этого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...