Таблицы внутреннего соединения mysql Sql 3 включают строки, в которых таблица 2 или таблица 3 пуста - PullRequest
0 голосов
/ 13 февраля 2019

mysql question:

Я пытаюсь выполнить внутреннее объединение нескольких таблиц на основе условия, но они отфильтровываются, если оба внутренних объединения не возвращают что-либо.

Например:

Выберите * из TopTable внутреннее соединение SecondTier1 b для a.ID = b.ID и c.Date_Column между 2019-2-1 и 2019-2-5 '

Допустим, этот запрос возвращает 20 записей.

и

Выберите * из TopTable внутреннююприсоединиться к SecondTier2 c для a.ID = c.ID и c.Date_Column между '2019-2-1' и '2019-2-5'

Допустим, этот запрос возвращает 10 записей

Теперь я хочу объединить эти результаты с одним запросом, но если SecondTier1 или SecondTier2 не возвращают значение, строка не отображается.

Что-то подобное неwork:

Select * from TopTable a 
inner join SecondTier1 b on a.ID= b.ID and b.Date_Column between '2019-2-1' and '2019-2-5' 
inner join SecondTier2 c on a.ID= c.ID and c.Date_Column between '2019-2-1' and '2019-2-5' 

Вместо возврата 30 записей возвращается 24 записи удаление записей, в которых SecondTier1 или SecondTier2 не объединяются, но я хотел бы, чтобы SecondTier1 или SecondTier2 имели объединениечтобы показать SecondTier1 или SecondTier2 как ноль, но если они оба равны нулю, не возвращать строку.

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

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Попробуйте следующее:

SELECT *
  FROM TopTable a 
  LEFT JOIN SecondTier1 b ON a.ID = b.ID AND b.Date_Column BETWEEN '2019-2-1' AND '2019-2-5' 
  LEFT JOIN SecondTier2 c ON a.ID = c.ID AND c.Date_Column BETWEEN '2019-2-1' AND '2019-2-5' 
  WHERE b.DateColumn IS NOT NULL OR c.Date_Column IS NOT NULL

Обратите внимание, что вы, вероятно, будете использовать столбец первичного ключа в предложении where, но я не знаю схему, с которой вы работаете.Кроме того, это было написано для сервера sql, поэтому могут быть некоторые очень незначительные различия в синтаксисе, за который нужно легко отчитываться.

(я предполагаю, что в вопросе была опечатка; ваш первый запрос не будет 'не работайте с таблицей c, так как там нет никаких соединений.)

0 голосов
/ 13 февраля 2019
SELECT * 
FROM TopTable a 
LEFT JOIN SecondTier1 b on a.ID= b.ID and c.Date_Column between '2019-2-1' and '2019-2-5' 
LEFT JOIN SecondTier2 c on a.ID= c.ID and c.Date_Column between '2019-2-1' and '2019-2-5' 
WHERE ID IN 
   (
      SELECT ID FROM SecondTier1 WHERE DateColumn BETWEEN '2019-2-1' and '2019-2-5'
      UNION 
      SELECT ID FROM SecondTier2 WHERE DateColumn BETWEEN '2019-2-1' and '2019-2-5'
   )
   AND (b.ID IS NOT NULL OR a.ID IS NOT NULL)
;
0 голосов
/ 13 февраля 2019

Вы можете использовать объединение

select ...
union all
select ...

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Хорошо, допустим, у вас есть 3 столбца в select1 и 5 в select2, и вы хотите отобразить их всевместе:


--returns 3 colums
select col1, col2, col3, null col4, null col5
from table1 a, table2 b
where a.id = b.id
and date > .....

union all
-- returns 5 columns
select col1, col2, col3, col4, col5
from table1 a, table2 b
where a.id = b.id
and date > .....

Знаешь, о чем я?PS: попробуйте организовать ваши cols, чтобы они были одного типа

...