Таблица 1:
Name Address Height Weight
X. y z. p
G. H. I J
Q W. E. R
Таблица 2:
Name Income Tax
X. y z.
В таблице 1 больше строк, чем в таблице 2. Все имена в таблице 2 находятся в таблице 1, но не все имена из таблицы 1 находятся в таблице 2. Можно ли как-нибудь сравнить строки между двумя таблицами и получить имена, которые появляются только в таблице 1, а не в таблице 2? MySQL
да, есть способ. Найдите, например, оператор МИНУС.
минимально воспроизводимый пример должен включать в себя как данные таблицы образцов, так и ожидаемый результат.
Вы используете MySQL или Postgresql?
Я использую MySQL
Не могли бы вы объяснить подробнее, что именно вы хотите сделать? Данные вашего образца действительно расплывчаты. Имена уникальные? Вас волнуют другие колонки? Допустим, у вас в таблице2 есть еще одна строка с именем Г., но доход и налог имеют другие значения. Что делать тогда? Это просто случайность, что два других столбца строк x имеют одинаковые значения (адрес и доход, оба y, высота и налог, оба z.) или это имеет значение?
@winterlyrock, это будет повторяющаяся задача?
Попробуй это...
WITH /* - S a m p l e D a t a : */
tbl_1 ( Name, Address, Height, Weight ) AS
( Select 'X.', 'y', 'z.', 'p' Union All
Select 'G.', 'H.', 'I', 'J' Union All
Select 'Q', 'W.', 'E.', 'R'
),
tbl_2 ( Name, Income, Tax ) AS
( Select 'X.', 'y', 'z.' )
/* S Q L : */
Select t1.*
From tbl_1 t1
Left Join tbl_2 t2 ON(t2.Name = t1.Name)
Where t2.Name Is Null;
Это MySQL? Я использую MySQL
@winterlyrock Этот SQL должен работать с любыми rdbms — это стандартный SQL.
WITH
реализовано в версии 8+.
@TheImpaler Верно, но With здесь просто для того, чтобы показать примеры данных - OP работает с таблицами из базы данных. Ему просто нужно настроить SQL с помощью левого соединения.
Я думаю, вы можете легко установить для других значение null, если вы используете MySQL.
SELECT t1.Name
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.Name = t2.Name
WHERE t2.Name IS NULL;
Нет необходимости присоединяться, потому что они не хотят выбирать из таблицы2.
Используйте общие
SELECT name FROM table_1
EXCEPT
SELECT name FROM table_2
Установите операции с помощью UNION, INTERSECT и EXCEPT
быстрый вопрос: чувствителен ли этот регистр?
@winterlyrock Зависит от сортировки столбца name
.
Для MySql
select * from table1 t1
where t1.Name not in (
select t2.Name from table2 t2
)
NOT IN
рискованно из-за возможных значений NULL
, этого можно избежать, используя NOT EXISTS
Избегайте NOT IN
, если вы не уверены на 100%, что нулей нет. В противном случае держитесь подальше от этого.
Если вы хотите включить только имена, существующие в обеих таблицах, а также их различия, вы можете использовать INNER JOIN.
SELECT
t1.Name,
t1.Height,
t2.Income,
(t1.Height - t2.Income) AS Height_Income_Difference,
t1.Weight,
t2.Tax,
(t1.Weight - t2.Tax) AS Weight_Tax_Difference
FROM
Table1 t1
INNER JOIN
Table2 t2 ON t1.Name = t2.Name;
И если вы также хотите получить различия между столбцами для строк, которые совпадают между двумя таблицами, а также имена, которые появляются только в таблице 1, вы можете использовать следующий запрос
SELECT
t1.Name,
t1.Height,
t2.Income,
(t1.Height - IFNULL(t2.Income, 0)) AS Height_Income_Difference,
t1.Weight,
t2.Tax,
(t1.Weight - IFNULL(t2.Tax, 0)) AS Weight_Tax_Difference
FROM
Table1 t1
LEFT JOIN
Table2 t2 ON t1.Name = t2.Name;
SELECT t1.Name
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.Name = t2.Name
WHERE t2.Name IS NULL;
Вы забыли опубликовать свою попытку решить эту проблему и не указать, какой тип SQL/СУБД вы на самом деле используете.