Полное внешнее объединение в C # с несколькими условиями - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь взять 2 таблицы данных, 1 с данными из базы данных SQL и 1 с данными из базы данных Oracle. Сами запросы работают нормально, проблема в том, чтобы объединить их без потери данных. Я пробовал много разных способов, предложенных в предыдущих вопросах переполнения стека, но они не сработали либо из-за моего непонимания (вероятно), либо код не подходит для моей ситуации.

Самое последнее решение, над которым я работаю, это:

 var leftOuterJoin = from table1 in mms_dt.AsEnumerable()
                     join table2 in flash_dt.AsEnumerable()
                     on new { X1 = (Decimal)table1["store_number"], X2 = (Decimal)table1["dept"] } equals new { X1 = Convert.ToDecimal(table2["store_number"]), X2 = Convert.ToDecimal(table2["dept"]) }
                     select new
                     {
                         Store = (Decimal)table1["store_number"],
                         Dept = Convert.ToDecimal(table1["dept"]),
                         WinDSS = (Decimal)table1["WinDSS"],
                         CORE = (Decimal)table1["CORE"],
                         RIM = (Decimal)table1["RIM"],
                         POS = (Decimal)table1["WinDSS"] + (Decimal)table1["CORE"],
                         Flash = Convert.ToDecimal(table2["sales_collected"]),
                         Difference = ((Decimal)table1["WinDSS"] + (Decimal)table1["CORE"]) - Convert.ToDecimal(table2["sales_collected"]),
                         Variance = (float)SafeDivision((((Decimal)table1["WinDSS"] + (Decimal)table1["CORE"]) - Convert.ToDecimal(table2["sales_collected"])), Convert.ToDecimal(table2["sales_collected"]))
                     }
                     into selection
                     orderby selection.Store, selection.Dept
                     select selection;

var rightOuterJoin = from table2 in flash_dt.AsEnumerable()
                     join table1 in mms_dt.AsEnumerable()
                     on new { X1 = Convert.ToDecimal(table2["store_number"]), X2 = Convert.ToDecimal(table2["dept"]) } equals new { X1 = Convert.ToDecimal(table1["store_number"]), X2 = Convert.ToDecimal(table1["dept"]) }
                     select new
                     {
                         Store = Convert.ToDecimal(table2["store_number"]),
                         Dept = Convert.ToDecimal(table2["dept"]),
                         WinDSS = (Decimal)table1["WinDSS"],
                         CORE = (Decimal)table1["CORE"],
                         RIM = (Decimal)table1["RIM"],
                         POS = (Decimal)table1["WinDSS"] + (Decimal)table1["CORE"],
                         Flash = Convert.ToDecimal(table2["sales_collected"]),
                         Difference = ((Decimal)table1["WinDSS"] + (Decimal)table1["CORE"]) - Convert.ToDecimal(table2["sales_collected"]),
                         Variance = (float)SafeDivision((((Decimal)table1["WinDSS"] + (Decimal)table1["CORE"]) - Convert.ToDecimal(table2["sales_collected"])), Convert.ToDecimal(table2["sales_collected"]))
                     }
                     into selection
                     orderby selection.Store, selection.Dept
                     select selection;

var res = leftOuterJoin.Union(rightOuterJoin);

foreach (var item in res)
{
    Console.WriteLine(item);
}

mms_dt и flash_dt - мои две таблицы данных. Я хочу выполнить соединение в каждой строке, в которой есть номер магазина и соответствие отдела. Обе таблицы содержат «store_number» и «dept». mms_dt также содержит столбцы «WinDSS, CORE, RIM», в то время как flash_dt содержит вместо «sales_collected». Когда этот код выполняется, он показывает только те строки, в которых есть данные из обеих таблиц, при этом отсутствует вся точка полного внешнего соединения. Я на 99% уверен, что допускаю глупую ошибку в синтаксисе из-за недостатка знаний SQL.

...