Cody O'Meara Ответов: 3

Как получить обратную сторону левого соединения.


У меня есть следующее ниже. При этом выбираются общие данные между 2 таблицами. Теперь мне нужно получить обратное, выбрать все, что не находится в таблице "результаты", но находится в таблице "сотрудники".

SELECT 
    distinct fullName
FROM 
    results 
LEFT JOIN employees
    ON name
    where dateTime > CURDATE()


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

РЕДАКТИРОВАТЬ:
пример:
Результирующая таблица:
Азбука 1999-05-28
АБВГДЕ 2020-05-28
Коди 1999-05-28

Таблица employees:
АЗБУКА
Коди
Раскидывать
ABCDEF


После использования dateTime = CURDATE (), который является 2020-05-28, мне нужно, чтобы он отображался

АЗБУКА
Коди
Раскидывать

поскольку не было никаких результатов, представленных на CURDATE(). Поскольку ABCDEF находится в CURDATE (), его не нужно отображать.

Наверное, мне стоит добавить немного предыстории. На нашем рабочем месте каждое утро пользователь заполняет ежедневную оценку состояния здоровья. Мы хотим иметь возможность видеть, кто не заполнил оценку в тот день, просто для отчетности.

Что я уже пробовал:

Я пытался сделать ровно наоборот, но я получаю 0 результатов, когда знаю, что они должны быть:
SELECT 
    name
FROM 
    employees
left JOIN results
    ON  fullName
    where dateTime >CURDATE()

3 Ответов

Рейтинг:
2

Richard Deeming

Предполагая, что dateTime колонка находится в results стол, ваш WHERE предложение отфильтровывает любые результаты, которые не имеют совпадения. Эти результаты будут иметь NULL в dateTime колонка.

Вы можете либо переместить фильтр в условие соединения:

SELECT
    employees.name
FROM
    employees
    LEFT JOIN results
    ON results.fullName = employees.name
    And results.dateTime > CURDATE()
WHERE
    results.fullName Is Null
;
Или использовать Not Exists пункт:
SELECT
    employees.name
FROM
    employees
WHERE
    Not Exists
    (
        SELECT 1
        FROM results
        WHERE results.fullName = employees.name
        And results.dateTime > CURDATE()
    )
;


Cody O'Meara

Спасибо Вам за вашу помощь! К сожалению, это, кажется, не работает. Для большего объяснения. В моей таблице "сотрудники" у меня есть 100 записей. В моей таблице "результаты" у меня есть 75 записей(после предложения where 'dateTime'). Я хочу отобразить 25 записей, которых нет в таблице'

Что касается темы "Дата-Время", то в моей таблице результатов у меня есть более 500 записей и около 75 добавляемых каждый день. "Дата-Время" фильтрует его, чтобы включить только сегодняшние результаты. Может быть, мне нужно добавить пункт where где-то еще?

Еще раз спасибо за ваш ответ!

Cody O'Meara

пример:
Результирующая таблица:
Азбука 1999-05-28
АБВГДЕ 2020-05-28
Коди 1999-05-28

Таблица employees:
АЗБУКА
Коди
Раскидывать
ABCDEF


После использования dateTime = CURDATE (), который является 2020-05-28, мне нужно, чтобы он отображался

АЗБУКА
Коди
Раскидывать

поскольку не было никаких результатов, представленных на CURDATE(). Поскольку ABCDEF находится в CURDATE (), его не нужно отображать.

Наверное, мне стоит добавить немного предыстории. На нашем рабочем месте каждое утро пользователь заполняет ежедневную оценку состояния здоровья. Мы хотим иметь возможность видеть, кто не заполнил оценку в тот день, просто для отчетности.

Richard Deeming

Вам нужно добавить фильтр к первому запросу, чтобы удалить записи, которые имеют совпадение в списке. results стол.

Как только вы это сделаете, меняйтесь results.dateTime > CURDATE() к results.dateTime = CURDATE() в любом случае запрос должен дать вам желаемые результаты.

Скрипка SQL[^]

Maciej Los

5ed!

Рейтинг:
1

MadMyche


Я бы, вероятно, начал с простого предложения WHERE с оператором NOT IN, как это

SELECT Distinct fullName
FROM   Results 
WHERE  Name NOT IN (SELECT Name FROM Employees)
AND    dateTime > CURDATE()

Похоже, то, что вы хотите, может сработать с этим.... но без приличной схемы, образцов данных или четкого понимания того, что именно вы хотите, я не могу быть уверен
Как свидетельствуют два заслуживающих доверия человека, которые пытались вам помочь
SELECT Distinct fullName
FROM   Employees 
WHERE  fullName NOT IN (
	SELECT Name
	FROM   Results)
	WHERE  dateTime = CURDATE()
)

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


Cody O'Meara

Спасибо за ответ. К сожалению я получаю 0 результатов

Cody O'Meara

Вот ссылка, чтобы показать мои 2 таблицы. Выделенные элементы должны отображаться так, как их нет в таблице fullName.

https://gyazo.com/66a84d81c7214cfc7d0dd9a41962bce0

MadMyche

Обновление "ответа"

Maciej Los

5ed!

Рейтинг:
0

Maciej Los

Проверить это:

CREATE TABLE results
(
  fullname varchar(50),
  somedate datetime
);

CREATE TABLE employees
(
  fullname varchar(50)
);

INSERT INTO results(fullname, somedate)
VALUES('ABC', '1999-05-28'),
('ABCDEF', '2020-05-28'),
('Cody', '1999-05-28');

INSERT INTO employees(fullname)
VALUES('ABC'), ('Cody'), ('Ted'), ('ABCDEF');

SELECT e.* 
FROM employees e 
WHERE NOT EXISTS
(
	SELECT 1
	FROM results r1
	WHERE r1.somedate = '2020-05-28' AND r1.fullname = e.fullname
) 



Скрипка SQL[^]