2015-06-22 6 views
2

Я искал по всему Интернету решение этой проблемы, но , похоже, никто не задавал этот вопрос до.SQL для объединения 2 несвязанных столбцов из 2 несвязанных таблиц

2 несвязанных стола, x столбцов каждый. Я хочу очень простой результат : иметь два столбца один рядом друг с другом, но с строками, соответствующими строкам (row1-row1, row2-row2).

I will elaborate in case it isn't clear to someone: 
___________________ 

-What I want to do, is to put 2 columns one next to each other: 
    -table1.column1 
    -table2.column1 

    So the result would be something like this: 
    table1.column1.ROW1 - table2.column1.ROW1 
    table1.column1.ROW2 - table2.column1.ROW2 
    table1.column1.ROW3 - table2.column1.ROW3 
    table1.column1.ROW4 - table2.column1.ROW4 
    table1.column1.ROW5 - table2.column1.ROW5 
    ..etc.. 
___________________ 

Запрос как "SELECT table1.column1, table2.column1 FROM table1, table2" не даст мне желаемого результата, так как он выходов строк * строки.

В случае, если кто-то интересно, почему в мире, я должен был бы поставить 2 несвязанные столбцы вместе с 2 несвязанные таблицы: Моя работа должен пойти в банк, взять свои базы данных с информацией клиентов и маски все данные (определенным образом, а не случайным образом). В конце у меня есть оригинальная таблица банка и ее идеальный клон - таблица клонов, заполняемая замаскированными данными. На этом этапе критические части пинки в:

  • Что мне нужно сделать, это сравнить столбец за столбцом: 1 столбец из исходной таблицы Банка с его клоном - один и тот же идентичную колонку, но с замаскированными данными в нем вместо исходных данных (что фактически является целым новым столбцом целой новой таблицы).

Для того, чтобы все данные были замаскированы надлежащим образом, соблюдая все критерии клиента (банка), мне нужно поместить все данные из столбца X, рядом со всеми данными из столбец Y, (строка1-строка1, строка2-строка2 и т. д.).

Что я сейчас делаю, это взять десятки печатных экранов и сравнить их, что тратит много и много и много времени.

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

Следует также упомянуть, что мне нечего ПРИСОЕДИНИТЬСЯ, так как все данные из таблицы1 полностью отличаются от всех данных из таблицы2, ничего общего.


РЕШЕНИЕ была предоставлена ​​пользователем «sstan», и она прекрасно работает. Этот запрос:


выберите table1.column, table2.column

из (выбрать ROWNUM в RN1, table1.column от YOURTABLE1.COLUMN table1) table1

присоединиться (выберите rownum как rn2, table2.COLUMN from YOURTABLE2.COLUMN table2) table2

на столе1.rn1 = таблица2.rn2;


Как адаптировать этот запрос к вашим таблицам, имейте в виду, что вы должны заменить только слова, которые я написал в письмах «капитал».

Запрос отлично работает на больших наборах данных. Я тестировал его на 100 000 строк, каждая строка на его месте, функция «rownum» не изменяет их вообще.

Это самый лучший и быстрый способ разместить 2 столбца один рядом друг с другом, с их сопоставленными рядами, из двух разных таблиц (из двух разных пользователей, а также в моем случае), у которых нет абсолютно ничего общего ПРИСОЕДИНЯЙТЕСЬ.

+0

Will ROW_NUMBER() работать для вас? –

+0

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

+0

Итак, если у меня есть 'table1.column1.row1', как мне найти соответствующий' table2.column1.row1'? Есть ли правило, которое позволяет вам сопоставить 2? Потому что, если это просто порядок строк, то вам нужно что-то заказать. Простое чтение обеих таблиц сверху вниз недостаточно, так как Oracle не хранит строки в определенном или детерминированном порядке внутри. – sstan

ответ

0

INNER JOIN обе ваши таблицы на чем-то вроде идентификационного номера клиента.

+0

Мне нечего добавить, 2 таблицы совершенно разные. Извините, я не сделал это ясно в исходном посте. –

0

Должно быть что-то, что нужно «ПРИСОЕДИНЯЙТЕСЬ». Например предположим, каждая строка в обеих таблицах есть столбец ClientID

SELECT table1.column1, table2.column1 FROM table1 
INNER JOIN table2 ON table2.ClientID = table1.ClientID 
+0

Идентификаторы клиентов разные, все по-другому в таблице1 из таблицы2. В таблице 1 у меня есть настоящие данные, в таблице 2 это все замаскированные данные, ничего не соответствует. –

1

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

мы можем отображать согласно вашим требованиям на основе использования joins.

Рад помочь дальнейшему

Вот запрос. Попробуйте что-нибудь подобное

create table table1(column1 varchar(255),column2 varchar(255)); 
insert into table1(column1,column2)values('a','a1'); 

--create temp table1 
create GLOBAL TEMPORARY TABLE temp1(rownumber int,column1,column2); 
insert into temp1 select Row_Number() Over(order by column1),column1,column2 from table1; 

--create table2  
create table table2(column1 varchar(255),column2 varchar(255)); 
insert into table2(column1,column2)values('b','b1'); 

--create temp table2  
create GLOBAL TEMPORARY TABLE temp2(rownumber int,column1,column2); 
insert into temp2 select Row_Number() Over(order by column1),column1,column2 from table1; 

--join based on rownumber 
select temp1.column1,temp2.column1 from temp1 join temp2 on temp1.rownumber=temp2.rownumber; 

Надеюсь, это поможет. Это должно решить проблему.

+0

Вот почему у меня есть эта проблема, мне нечего туда навещать. Все данные из таблицы 1 полностью отличаются от всех данных из таблицы 2. Это точка маскировки. После маскировки данные не остаются неизменными, иначе это может привести к тому, кто является фактическим клиентом. Все, что указано в таблице 1, отличается от всего, что указано в таблице 2. Как-то я должен найти способ сопоставить строки из обеих таблиц, которые я могу сделать, но несколько раз с помощью «Выберите table1.column1, table2.column1 FROM table1, Таблица 2;" - это дает мне желаемый результат, но многие другие мне тоже не нужны. –

+0

в порядке. вы хорошо объяснили мне. Создайте две временные таблицы для table1 и table2. Добавьте все столбцы в первую таблицу вместе со столбцом для ROW_NUMBER(). Сделайте то же самое для второй таблицы. Присоедините их оба к столбцу ROW_NUMBER(). Я пытаюсь опубликовать код в ближайшее время. Надеюсь, это поможет. Давайте посмотрим – staticvoidmain

+0

Привет @Robert, я обновил ответ с помощью примерного кода. Я буду очень рад, если это сработает для вас. ** В Oracle нет ничего невозможного. Если это не сработает, позвольте мне помочь вам дальше или, пожалуйста, отметьте это как ответ. – staticvoidmain

0

К сожалению, все, что вы просите, не представляется возможным.

Просто делать select * from table1 и select * from table2 бок о бок не будет волшебным образом соединять строки так, как вы ожидаете. Это связано с тем, что вы не можете контролировать, как Oracle выбирает хранилище внутренних элементов или как он вернет их вам (если вы не укажете предложение ORDER BY). Это даже не учитывает, что Oracle может перемещать строки по мере их соответствия, когда значения обновляются.

Рекомендация: перезапустите процесс маскировки. Уже не поздно, не так ли? У вас все еще есть исходные данные.

Но на этот раз, прежде чем это сделать, добавьте новый столбец на table1 под названием Id или что-то в этом роде. Это не обязательно должно иметь какое-то особое значение. Вы можете автоматически генерировать его с помощью последовательности. Просто убедитесь, что идентификатор каждой строки уникален, создав на нем уникальное ограничение или, еще лучше, определите его как первичный ключ.

Затем, когда вы замаскируете все данные и поместите их в table2, обязательно сохраните это значение Id в соответствующей строке table2.

Только тогда вы сможете сделать то, что вы просите с запросом, например, как это:

select t1.*, t2.* 
from t1 
join t2 on t2.Id = t1.Id 

Там нет никакого способа обойти это.

EDIT:

Что вы просите это запрос:

select t1.*, t2.* 
from (select rownum as rn, t.* from table1 t) t1 
join (select rownum as rn, t.* from table2 t) t2 
    on t2.rn = t1.rn 

Но я действительно не понимаю, как ваши строки будут просто волшебно соответствовать, как вы ожидаете их. Надеюсь, вы это поймете. И если это так, я настоятельно рекомендую вам рассмотреть мой другой вариант выше.

EDIT 2:

не может быть надежным источником информации, когда речь идет о Oracle. Но Том Ките. Пожалуйста, прочитайте следующую тему и его ответы. Я думаю, что это поможет вам понять проблему лучше:

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6257473400346237629

+0

Идентификатор row1 из таблицы 1 отличается от ID1 строки из таблицы2, поэтому вы предсказывали, что он не будет работать с этим запросом. –

+0

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

+0

Я очень рад слышать, что вы говорите, что :) – sstan

0

Вы можете использовать ROW_NUMBER() OVER (...) ИЛИ ROWNUM для создания псевдо-колонки, чтобы присоединиться к таблицам на. Если вам нужны таблицы в определенном порядке для присоединения, вы можете указать это с помощью ROW_NUMBER() OVER (ORDER BY column_name).

SQL Fiddle

Oracle 11g R2 Настройка схемы:

CREATE TABLE random1 (ID1, VALUE1) AS 
      SELECT 1, 20 FROM DUAL 
UNION ALL SELECT 5, 32 FROM DUAL 
UNION ALL SELECT 3, 5 FROM DUAL; 

CREATE TABLE random2 (ID2, VALUE2) AS 
      SELECT 6, 17 FROM DUAL 
UNION ALL SELECT 4, 10 FROM DUAL 
UNION ALL SELECT 2, 7 FROM DUAL; 

Запрос 1:

SELECT ID1, 
     ID2, 
     VALUE1 - VALUE2 AS difference 
FROM (SELECT ID1, 
       VALUE1, 
       ROW_NUMBER() OVER (ORDER BY NULL) AS RN 
     FROM RANDOM1) a 
     INNER JOIN 
     (SELECT ID2, 
       VALUE2, 
       ROW_NUMBER() OVER (ORDER BY NULL) AS RN 
     FROM RANDOM2) b 
     ON (a.RN = b.RN) 

Results:

| ID1 | ID2 | DIFFERENCE | 
|-----|-----|------------| 
| 1 | 6 |   3 | 
| 5 | 4 |   22 | 
| 3 | 2 |   -2 | 

Запрос 2:

SELECT ID1, 
     ID2, 
     VALUE1 - VALUE2 AS difference 
FROM (SELECT ID1, 
       VALUE1, 
       ROWNUM AS RN 
     FROM RANDOM1) a 
     INNER JOIN 
     (SELECT ID2, 
       VALUE2, 
       ROWNUM AS RN 
     FROM RANDOM2) b 
     ON (a.RN = b.RN) 

Results:

| ID1 | ID2 | DIFFERENCE | 
|-----|-----|------------| 
| 1 | 6 |   3 | 
| 5 | 4 |   22 | 
| 3 | 2 |   -2 | 
+0

Я не знаком с концепциями, которые вы использовали в коде, мне придется вернуться домой и дать ему более подробный обзор. Тем временем я отредактировал свой оригинальный пост, посмотри на его конец, спасибо. –

Смежные вопросы