Определение исходной таблицы из запроса UNION, учитывая, что обе таблицы имеют повторяющиеся значения - PullRequest
0 голосов
/ 12 января 2020

Я наткнулся на этот вопрос, SQL - Идентификация исходной таблицы из запроса UNION , но как насчет того, когда обе таблицы имеют одинаковые данные строки и столбец? Как мы можем определить, из какой таблицы это произошло? Есть ли другой способ сделать это, кроме UNION/UNION ALL?

Пример:

Это Таблица_1

+--------+---------+------------------+-----------------+
| ID_No  | ID_Type |      Data        | Input_Timestamp |
+--------+---------+------------------+-----------------+
|  1101  |  1000   | LARGE MANGO X12  |    2019-12-21   | 
+--------+---------+------------------+-----------------+
|  1102  |  1000   | LARGE BANANA X12 |    2019-12-22   |
+--------+---------+------------------+-----------------+
|  1103  |  1000   | LARGE ORANGE X12 |    2019-12-23   |
+--------+---------+------------------+-----------------+
|  1104  |  1000   | LARGE GRAPES X12 |    2019-12-24   |
+--------+---------+------------------+-----------------+

Это Таблица_2

+--------+---------+------------------+-----------------+
| ID_No  | ID_Type |      Data        | Input_Timestamp |
+--------+---------+------------------+-----------------+
|  1101  |  1000   | LARGE MANGO X12  |    2019-12-21   | 
+--------+---------+------------------+-----------------+
|  1102  |  1000   | LARGE BANANA X12 |    2019-12-22   |
+--------+---------+------------------+-----------------+
|  1103  |  1000   | LARGE ORANGE X12 |    2019-12-23   |
+--------+---------+------------------+-----------------+
|  1105  |  1000   | LARGE GINGER X12 |    2019-12-25   |
+--------+---------+------------------+-----------------+

Выполнение UNION как это не будет работать, потому что они будут продублированы.

SELECT 'from_table_1' as from_table, ID_No, ID_Type, Data, Input_Timestamp FROM Table_1
UNION 
SELECT 'from_table_2' as from_table, ID_No, ID_Type, Data, Input_Timestamp FROM Table_2

Есть ли способ сделать это правдоподобным? Или есть какой-то другой способ, чтобы это сработало?

Это будет мой ожидаемый результат.

+--------------+--------+---------+------------------+-----------------+
|  from_table  | ID_No  | ID_Type |      Data        | Input_Timestamp |
+--------------+--------+---------+------------------+-----------------+
| from_table_1 |  1101  |  1000   | LARGE MANGO X12  |    2019-12-21   | 
+--------------+--------+---------+------------------+-----------------+
| from_table_1 |  1102  |  1000   | LARGE BANANA X12 |    2019-12-22   |
+------------+----------+---------+------------------+-----------------+
| from_table_1 |  1103  |  1000   | LARGE ORANGE X12 |    2019-12-23   |
+--------------+--------+---------+----------------+-----------------+
| from_table_1 |  1104  |  1000   | LARGE GRAPES X12 |    2019-12-24   |
+--------------+--------+---------+------------------+-----------------+
| from_table_2 |  1105  |  1000   | LARGE GINGER X12 |    2019-12-25   |
+--------------+--------+---------+------------------+-----------------+

Единственная причина, по которой я хочу, чтобы это работало, это то, что я могу различать guish откуда взяты данные и возможность кодировать их во внешнем интерфейсе, потому что Table_2 будет конечными данными, а Table_1 по-прежнему можно редактировать при необходимости.

Подводя итог, таблица_1 будет иметь приоритет при отображении данных перед таблицей_2, если в таблицах_1 и таблице_2 имеются повторяющиеся значения.

Спасибо.

1 Ответ

1 голос
/ 12 января 2020

Если вы хотите узнать, из каких данных поступают строки, вы можете использовать union all и агрегацию:

select ID_No, ID_Type, Data, Input_Timestamp, count(*) as num_tables
from ((select ID_No, ID_Type, Data, Input_Timestamp, 1 as which
       from table1
      ) union all
      (select ID_No, ID_Type, Data, Input_Timestamp, 2 as which
       from table2
      )
     ) t12
group by ID_No, ID_Type, Data, Input_Timestamp;

Тогда, если вам нужны только строки в одной таблице, вы можете добавить having count(*) = 2 в таблицу.

Примечание. В этой версии предполагается, что в каждой таблице нет дубликатов.

РЕДАКТИРОВАТЬ:

Если вы хотите установить приоритет строк, вы можете укажите это как:

select t1.*, 'table1' as which
from table1 t1
union all
select t2.*, 'table2'
from table2 t2
where not exists (select 1
                  from table1 t1
                  where t1.id_no = t2.id_no
                 );

Это только один раз захватывает id_no s между двумя таблицами. Вы можете добавить дополнительные сравнения в другие столбцы, если хотите получить точные дубликаты.

...