#mysql #sql
#mysql #sql
Вопрос:
У меня есть две таблицы X и Y, я хочу вернуть данные из таблицы Y, где X.id=Y.id
и из таблицы X, я хочу вернуть только те строки, где X.id!=Y.id
.
Я написал запрос
Select * from X left join Y on X.id=Y.id
но это вернуло бы мне все строки из таблицы X, где, поскольку я хочу только те, где X.id!=Y.id
.
Как бы я это сделал? Я надеюсь, что вопросы понятны.
Комментарии:
1. Этот вопрос поразил меня. Я ничего не понял. Может быть, SQLFiddle ?
2.
X.id!=Y.id
илиX.id=Y.id
? какой из них это?3. вы пробовали
Select * from X left join Y where X.id=Y.id
4. вам нужно общее поле (обычно первичный ключ в одной таблице соединяется с внешним ключом в другой). если значения в предложении ON не совпадают, на каком основании вы бы связали две таблицы? Вы знаете, для чего используется объединение?
5. Ну, давайте представим, что вы получаете данные из Y на основе условия X.id=Y.id и из X на основе условия X.id !=Y.id . Как вы хотите соединить эти два разных набора данных?
Ответ №1:
select * from X right join Y on X.ID=Y.ID
или
select * from Y left join X on X.ID=Y.ID
Затем вы получаете все строки из Y и те, на которые есть ссылки в X-таблице, и все данные из X-таблицы, на которые есть ссылка в Y.
Это был ваш вопрос?
Другой ответ, который я вижу в этом вопросе, таков
with cte (X.ID,Y.ID)
as(
select x.ID,y.ID from X INNER JOIN Y ON X.ID=Y.ID
)
select * from Y JOIN cte
where t.id not in (cte.Y.ID)
UNION ALL
select * from cte
Что-то подобное (возможно, потребуется некоторая отладка, было написано без управления SQL или SQL Developper :))
Ответ №2:
Все строки Y, для которых в X существует идентификатор:
SELECT Y.*
FROM Y
INNER JOIN X
USING(id)
Все строки X, для которых нет существующего идентификатора в Y
SELECT X.*
FROM X
WHERE id NOT IN (
SELECT id
FROM Y
)
Если выходные столбцы совпадают, вы могли бы выполнить ОБЪЕДИНЕНИЕ обоих запросов.
Ответ №3:
Допустим, у нас есть две таблицы, упомянутые как:-
выберите * из cmp_Company как x
выберите * из cmp_Company_Contact как y
Случай A: [Все строки, возвращенные из Y-таблицы]
выберите Y.* из cmp_Company_Contact как Y СЛЕВА ПРИСОЕДИНИТЕ cmp_Company как X К X.CO_ID = Y.CO_ID где X.CO_ID = Y.CO_ID
Случай B: [Из таблицы X не возвращаются строки]
выберите X.CO_Name из cmp_Company как X СЛЕВА ПРИСОЕДИНИТЕ cmp_Company_Contact как Y К Y.CO_ID = X.CO_ID где X.CO_ID != Y.CO_ID
Таким образом, исходя из условия, которое вы запрашиваете, данные не будут получены.
Надеюсь, это поможет.
Спасибо