Как получить разницу между двумя столбцами между двумя таблицами SQL с помощью запросов SQL?

Таблица 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

Вы забыли опубликовать свою попытку решить эту проблему и не указать, какой тип SQL/СУБД вы на самом деле используете.

Scott Hunter 05.08.2024 17:31

да, есть способ. Найдите, например, оператор МИНУС.

Randy 05.08.2024 17:32

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

jarlh 05.08.2024 17:33

Вы используете MySQL или Postgresql?

jarlh 05.08.2024 17:33

Я использую MySQL

winterlyrock 05.08.2024 18:11

Не могли бы вы объяснить подробнее, что именно вы хотите сделать? Данные вашего образца действительно расплывчаты. Имена уникальные? Вас волнуют другие колонки? Допустим, у вас в таблице2 есть еще одна строка с именем Г., но доход и налог имеют другие значения. Что делать тогда? Это просто случайность, что два других столбца строк x имеют одинаковые значения (адрес и доход, оба y, высота и налог, оба z.) или это имеет значение?

Jonas Metzler 05.08.2024 18:32

@winterlyrock, это будет повторяющаяся задача?

Derek Roberts 05.08.2024 18:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
76
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Попробуй это...

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 05.08.2024 18:12

@winterlyrock Этот SQL должен работать с любыми rdbms — это стандартный SQL.

d r 05.08.2024 19:52
WITH реализовано в версии 8+.
The Impaler 05.08.2024 20:48

@TheImpaler Верно, но With здесь просто для того, чтобы показать примеры данных - OP работает с таблицами из базы данных. Ему просто нужно настроить SQL с помощью левого соединения.

d r 05.08.2024 22:20

Я думаю, вы можете легко установить для других значение null, если вы используете MySQL.

SELECT t1.Name
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.Name = t2.Name
WHERE t2.Name IS NULL;

Нет необходимости присоединяться, потому что они не хотят выбирать из таблицы2.

Jonas Metzler 05.08.2024 18:27
Ответ принят как подходящий

Используйте общие

SELECT name FROM table_1
EXCEPT
SELECT name FROM table_2

Установите операции с помощью UNION, INTERSECT и EXCEPT

быстрый вопрос: чувствителен ли этот регистр?

winterlyrock 06.08.2024 17:11

@winterlyrock Зависит от сортировки столбца name.

Akina 06.08.2024 18:27

Для MySql

select * from table1 t1 
where t1.Name not in (
    select t2.Name from table2 t2  
)
NOT IN рискованно из-за возможных значений NULL, этого можно избежать, используя NOT EXISTS
Jonas Metzler 06.08.2024 09:10

Избегайте NOT IN, если вы не уверены на 100%, что нулей нет. В противном случае держитесь подальше от этого.

The Impaler 06.08.2024 22:07

Если вы хотите включить только имена, существующие в обеих таблицах, а также их различия, вы можете использовать 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;

Другие вопросы по теме