Sql - соединение 4 таблиц
Я прошу прощения за свое вступительное слово, но оно должно быть сказано... Я собираюсь задать вопрос, который может показаться простым опытным пользователям. Пожалуйста, не принижайте меня, говоря, что что-то должно быть очевидно для меня, или вы "не будете писать код для меня", так как это не то, что я прошу. Я так устала от того, что снобы обращаются со мной как с идиоткой, когда я задаю вопрос. Простая полезная рука и указание направления-это все, о чем я прошу, а не переписывание кода, чтобы я мог понять в будущем и больше не просить помощи в этом вопросе.
Я пытаюсь присоединиться к другой таблице для записи данных. Соединение, которое у меня есть в настоящее время, работает нормально, но когда я добавляю еще один оператор JOIN, я теряюсь. Мой набор навыков ограничен, когда речь заходит о нескольких соединениях, и это соединение довольно сложно.
У меня есть 2 таблицы, tbSECTIONS и tbDESCRIPT, которые содержат "общие данные", которые являются не чем иным, как таблицей имен разделов, присвоенных номером, и, аналогично, таблицей описаний tbDESCRIPT, присвоенных номером и которые объединяются и ссылаются на таблицу tbEXPENSES. Это прекрасно работает.
tbEXPENSES-это таблица, содержащая информацию о расходах и использующая вышеприведенные таблицы для классификации товаров на основе номеров разделов и описаний, присвоенных введенным данным, и записывает их в таблицу Weekly_Expense_Table. Это прекрасно работает.
Теперь мне нужно отделить то, что не записано в таблицу Weekly_Expense_Table, и поместить эту информацию в таблицу PersonalExpenses. Я пытался присоединиться к таблице PersonalExpenses в нескольких местах и несколькими способами, но ничего из того, что я делаю, не является правильным. Мое незнание лежит на том, к какому столу я должен присоединиться? Единственное, что может быть общим, - это таблица tbDESCRIPT, соответствующая именам столбцов в PersonalTable. Я уверен, что не очень хорошо объясняю это из-за моего непонимания, но добавлю любой код, который может помочь кому-то расшифровать мою проблему. Просто спросите, какая часть(ы) кода вам нужна.
Моя область проблем - это линия:
LEFT OUTER JOIN PersonalExpenses ON tbEXPENSES.REC_DATE = PersonalExpenses.RECEIPT_DATE"
Очевидно, что он не присоединяется к таблице должным образом, так как я получаю ошибку "ключ не найден", когда пытаюсь запустить запрос.
Что я уже пробовал:
Мой SQL JOIN в настоящее время кодируется как таковой:
Dim begdate As String = wrkdate1.ToShortDateString Dim enddate As String = wrkdate.ToShortDateString taSecDesc.Adapter.SelectCommand = New SqlClient.SqlCommand("SELECT * FROM tbDESCRIPT" & " LEFT OUTER JOIN tbSECTIONS ON tbDESCRIPT.SECT_ID = tbSECTIONS.ID" & " LEFT OUTER JOIN tbEXPENSES ON tbDESCRIPT.ID = tbEXPENSES.DESCRIPT_ID AND tbEXPENSES.REC_DATE Between '" & begdate & "' and '" & enddate & " 23:59:59'" & " LEFT OUTER JOIN PersonalExpenses ON tbEXPENSES.REC_DATE = PersonalExpenses.RECEIPT_DATE" & " WHERE REC_DATE Is Not NULL ORDER BY tbSECTIONS.ID, tbDESCRIPT.ID, LoadNumber", taSecDesc.Connection)
PIEBALDconsult
Сразу две вещи-не используйте строки для дат и всегда используйте параметризованный оператор.
Кроме этого, какая система баз данных?
A_Griffin
Я не эксперт в SQLServer, но я подумал, что ваше условие AND должно быть частью условия WHERE и приходить после объединения. например, выбрать ... ОТ... ПРИСОЕДИНИТЬСЯ [ПРИСОЕДИНИТЬСЯ...} ГДЕ ... И... ЗАКАЗАТЬ ПО
Кроме того, могу ли я предложить использовать ключевое слово AS для создания упрощенных прозвищ для ваших таблиц - это делает SQL более компактным и, IMO, более легким для чтения.
Выберите * из tbDESCRIPT как D
Левое внешнее соединение tbSECTIONS как с Д. SECT_ID = С. ИД ЭСТ ...
CHill60
Вы можете использовать и как часть предложения ON для объединения. Я согласен с вами в использовании псевдонимов для таблиц но использование AS в значительной степени является вопросом личных предпочтений
K3JAE
Ладно, спасибо тебе за это. Я могу адаптировать SQL-оператор с помощью параметризованных операторов, после того как я получу эту работу должным образом, а затем преобразую ее, поскольку я также согласен, что это делает ее немного аккуратнее и компактнее.
Я не уверен, как передать дату тогда, не используя строку?
Я использую MSSQL в качестве своей базы данных.
an0ther1
Объединение таблиц по датам-плохая идея. Между TbExpenses и PersonalExpenses должен быть ключ, который соединяет данные, в противном случае вы получите все личные расходы, соответствующие значению даты, и, следовательно, вы можете получить дубликаты - это зависит от того, как хранятся ваши значения даты - если вы используете тип данных DateTime и заполняете компонент времени, то менее вероятно, что если вы просто заполняете значение даты, то вы получите все записи личных расходов.
Кроме того, как сказал A_Griffin, ваш оператор join для таблицы tbExpenses дублирует ваш оператор where - нет никакого смысла делать это.
с уважением
Jörgen Andersson
Не могли бы вы обновить вопрос с помощью определений таблиц?