Как сравнить данные со всей базой данных SQL?
Первоначально я сделал заявление сравнения, которое хорошо работает. Он полностью присоединяется к моим таблицам на основе их идентификаторов таблиц. потом импорт листа Excel в своей таблице, а затем сравнить оба. Однако я еще не импортировал все свои данные. При проведении исследований я обнаружил, что если я заполняю таблицу или таблицы в наборе данных, то каждая таблица может состоять только из 16 777 216 строк. Однако проблема в том, что моя база данных предназначена для генеалогии, а SSDI (индекс смертности социального страхования) составляет более 90 миллионов имен.
Мне нужно иметь возможность полностью объединить все мои таблицы, которые находятся в базе данных, чтобы я мог сделать истинное сравнение при сопоставлении. в основном мне нужно взять внешнюю таблицу, импорт excel, и сравнить ее со всей базой данных. Как я могу сравнить свои данные с сотнями миллионов людей?
temptable.Reset() 'first make a connection string to your excel file, if you want to search for multiple excel files to pick from. Dim excelConnection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + files.FileName + ";Extended Properties=Excel 12.0;") Dim excmd As New OleDbCommand("Select * from [Sheet1$]", excelConnection) excelConnection.Open() Dim sheet1 As String = excelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing).Rows(0)("TABLE_NAME").ToString() 'Dim dtExcelData As New DataTable() 'dtExcelData.Reset() Dim oda As New OleDbDataAdapter((Convert.ToString("SELECT * FROM [") & sheet1) + "]", excelConnection) oda.Fill(temptable) excelConnection.Close() 'dipose excelConnection.Dispose() oda.Dispose() excmd.Dispose()
затем я вставляю с помощью sqlbulkinsert из временной таблицы, но, глядя на это сейчас, так как это временная таблица, я не думаю, что мне это нужно. Я бы просто использовал таблицу в памяти и не делал ее частью базы данных.
далее я полностью присоединяюсь ко всем своим столам
'connect to Dim sqlconn1 As New SqlConnection("SQLCON") Dim sqladaptor = New SqlDataAdapter sqlconn1.Open() sqladaptor.SelectCommand = New SqlCommand("Select Profile.Individual_ID, First_name, Middle_name, Last_name, Sex, Race, Place_of_birth, County_of_birth, State_of_birth, Date_of_birth, death.Death_ID, Place_of_death, State_of_death, County_of_death, Date_of_death, Cause_of_death, Cemetery_reference.Cemetery_ID, Cemetery_name, Cemetery_state, Cemetery_county, Cemetery_address, Cemetery_Section, Cemetery_Row, Cemetery_Lot, Grave, Burial_date from Profile full join Death On profile.Individual_ID = death.individual_ID full join Burial On Profile.Individual_ID = Burial.Individual_ID full join Cemetery_reference On Burial.Cemetery_ID = Cemetery_reference.Cemetery_ID ORDER BY Last_name ASC, First_name ASC, Date_of_birth ASC", sqlconn1) sqladaptor.SelectCommand.CommandTimeout = False sqladaptor.SelectCommand.ExecuteNonQuery() sqladaptor.Fill(dt) sqlconn1.Close() sqlconn1.Dispose() sqladaptor.Dispose()
затем я переставляю свой взгляд на временную таблицу
Dim view As New DataView(temptable) view.Sort = "Last_name ASC, First_name ASC, Date_of_birth ASC" Dim temptab As DataTable = view.ToTable temptable.Clear() temptable = temptab
затем я делаю свои сравнения ряд за рядом
For I = 0 to temptable.rows.count For i2 = 0 to dt.rows.count 'match code next next
одна из проблем, которая возникает, заключается в том, что человек может быть похоронен несколько раз. Я работаю над тем, чтобы показать эти эксгумации и перезахоронения, но каждый из них с внутренним соединением создаст новый ряд. однако дата захоронения теперь будет отличаться от первоначальной даты захоронения, потому что они были перезахоронены, если только их не кремировали после этого.
пока единственными константами являются Дата рождения и дата смерти. вы можете быть мертвым только один раз и быть живым только один раз.
First_name Middle_name Last_name Gender Date_of_death Date_of_birth Place_of_birth WILLIAM THAMES HAMMES M 1/1/1957 1/1/1900 New York JAMES W ODONNELL M 1/2/1957 1/2/1900 New York
код определит, имеет ли временная таблица какой-либо соответствующий столбец для любой из таблиц, используемых в операторе join. Если для этого человека в таблице существует запись, она обновит недостающую информацию. Если запись не существует, то будет добавлена новая строка с соответствующей информацией, относящейся к каждой таблице.
надеюсь, эта дополнительная информация поможет вам.
Что я уже пробовал:
На данный момент я сделал внутреннее соединение всех таблиц базы данных, а затем сравнил их с вставленной bulksql временной таблицей excel. Я использовал sqldataadapter.метод заполнения как для таблиц базы данных, так и для внешних данных. Мне просто нужна помощь в правильном направлении, которая показала бы лучший метод достижения того, что я ищу.
Garth J Lancaster
Я думаю, что вам следует изменить (использовать "улучшить вопрос") свой вопрос и дать еще несколько подробностей - например, "какой" сервер БД вы используете, MySql, SQL Server и т. д., Возможно, "сокращенные" схемы и т. д. "Нам здесь" очень трудно дать вам ответ, основанный на том, что у вас есть до сих пор.
Я мог бы сказать "индексирование" /секционирование и/или создание представлений над вашими данными как очень общий метод, но, вероятно, неправильный подход, потому что в том, что вы предоставили, недостаточно информации для уточнения ответа
Maciej Los
Какая база данных?
Maciej Los
Эта строка (подчеркнутая часть) очень странная:
Dim oda As New OleDbDataAdapter((Convert.ToString("SELECT * FROM [") & sheet1) + "]", excelConnection)
Вам не нужно преобразовывать строку в строку, потому что это уже строка!
Какие данные хранятся в файле Excel?