K3JAE Ответов: 1

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

Не могли бы вы обновить вопрос с помощью определений таблиц?

1 Ответов

Рейтинг:
0

Laxmidhar tatwa technologies

Всегда соединение должно быть с первичным ключом и концепцией ключа forgein

sql хранит дату и время в поле datetime .так что в вашем объединении таблиц

не имеют общих значений даты и времени для нижеприведенных полей

tbEXPENSES.REC_DATE = PersonalExpenses.RECEIPT_DATE