2014-11-12 3 views
0

У меня есть 2 таблицы, называемые table_one и table_two, со следующими свойствами:Выберите данные из таблиц MySQL

  • Оба из них имеют одну общую колонку под названием column_id.
  • Значения table_one.column_id являются уникальными, тогда как значения table_two.column_id - нет.
  • table_two имеет два дополнительных столбца: ts_one и ts_two. ts_one не является нулевым, но ts_two может быть пустым. Только одна строка в table_two.column_id допускает значение ts_two равным нулю.
  • Не все значения от table_one.column_id могут быть представлены в table_two.column_id.

Например:

table_one 
column_id 
1 
2 
3 
4 
5 


table_two 
column_id ts_one  ts_two 
2   2014-10-01 null 
3   2014-10-02 2014-10-03 
3   2014-10-05 null 
4   2014-10-01 2014-10-05 

Мне нужно, чтобы получить все идентификаторы из table_one.column_id, где:

  1. идентификатора в table_one.column_id, а не в table_two.column_id (1, 5 удовлетворяет что)
  2. id в table_one.column_id и в table_two.column_id, где ts_two не является нулевым и нет других строк с одинаковым идентификатором, где ts_two с нулевым значением - (удовлетворяет только 4).

Оба условия должны быть приняты во внимание. Результаты должны включать 1, 4 и 5.

ответ

0

Вы можете сделать это с помощью одного соединения и агрегата ...

SELECT t1.column_id FROM table_one AS t1 
LEFT JOIN (
    SELECT column_id, (COUNT(column_id) = COUNT(ts_two)) as no_nulls FROM table_two 
    GROUP BY column_id 
) AS t2 
ON t1.column_id = t2.column_id 
WHERE t2.column_id IS NULL OR (t2.column_id IS NOT NULL AND t2.no_nulls = TRUE) 

SQLFiddle:. http://sqlfiddle.com/#!2/14855/8/0

  1. Запрос все из таблицы 1
  2. запросов каждый идентификатор из таблицы 2, а есть ли какие-либо нуль ts_two записей для этого идентификатора.
  3. Объединяет их вместе, если 1 отсутствует в 2 или 1 находится в 2 и не имеет нулевых записей ts_two.
0

для вашего первого вопроса "идентификатор в table_one.column_id и не в table_two.column_id (1, 5) "

этот запрос должен сделать

SELECT column_id 
FROM table_one AS o 
WHERE NOT EXISTS (SELECT 1 FROM table_two WHERE column_id = o.column_id) 

для вашего второго вопроса «идентификатор в table_one.column_id и в table_two.column_id где ts_two не утратившие нет идентификатора с нулевым значением - (только 4)»

этот запрос должен также сделать

SELECT t.* FROM table_two AS t 
INNER JOIN table_one AS o ON o.column_id = t.column_id 
WHERE t.ts_two IS NOT NULL AND NOT EXISTS (SELECT 1 FROM table_two WHERE ts_two IS NULL AND column_id = o.column_id) 

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

SELECT DISTINCT column_id 
FROM (
SELECT column_id 
FROM table_one AS o 
WHERE NOT EXISTS (SELECT 1 FROM table_two WHERE column_id = o.column_id) 
UNION 
SELECT t.column_id FROM table_two AS t 
INNER JOIN table_one AS o ON o.column_id = t.column_id 
WHERE t.ts_two IS NOT NULL AND NOT EXISTS (SELECT 1 FROM table_two WHERE ts_two IS NULL AND column_id = o.column_id) 
) AS t 
+0

Я только что проверил свой код, и он работает – Jaylen

+0

Оба условия должны быть приняты во внимание одновременно. результат должен включать 1, 4 и 5 – poul

+0

Поместите 'UNION' и' DISTINCT t.column_id' во второй запрос: [SqlFiddle] (http://sqlfiddle.com/#!2/0dfe7/3) – MamaWalter

0

Обновлено Fiddle: http://sqlfiddle.com/#!2/0b39d2/15/0

SELECT * 
FROM Table_one A 
LEFT JOIN Table_Two B 
on A.Column_ID = B.ColumN_ID 
LEFT JOIN (Select column_ID 
      From table_two 
      where ts_one is null or ts_two is null) C 
    ON A.ColumN_Id = C.Column_ID 
WHERE C.Column_ID is null 
OR B.Column_ID is Null; 

Что это делает:

  • возвращает все данные из таблицы 1 в наборе 1
  • Соединения к данным из таблицы 2, которые не находятся в 1,5 (добавляет данные в набор 1)
  • Объединяется с данными из таблицы 2, которая была отфильтрована только для записей с нулями (создает 2-й набор)
  • Исключает записи, где совпадения существуют во втором соединении со второй таблицей.(фильтры данных, так что данные только в первом сете, а не во втором наборе возвращаемые
+0

вы hardcoded (1,5), но может быть больше значений – poul

+0

Достаточно просто вытащил его и добавил where where where B.column_Id null. – xQbert

+0

этот выглядит правильно. Я сделаю больше тестов, а затем смогу принять их. благодаря – poul

Смежные вопросы