BrunoPigeon Ответов: 2

Sql-запрос из двух таблиц


Всем привет. У меня есть две таблицы в Access (в VB6): SupplierInvoices усилителя; amp; Сбываний. Они оба имеют 3 общие имена полей: дата, плю &усилителя; кол-во. Мне нужно запросить обе таблицы с помощью SQL-запроса по определенному диапазону дат следующим образом (я знаю, что это неправильно, но просто чтобы дать вам представление):

rs.Open "выберите отдельный формат(SupplierInvoices.Дата, "ДД-МММ-гггг") как tDate, Sum(SupplierInvoices.Кол-во) как tTotal от SupplierInvoices, формат(продажи.Дата, 'ДД-МММ-гггг') как sDate, Sum(продажи.Кол-во) как сфотал от продаж, где ПЛУ = '" &амп; lblPLU.Заголовок усилителя; amp; " и дата между #" &амп; оно &ампер; "# и #" &АМП; EndTime &ампер; " группа по формату(SupplierInvoices.Дата, 'dd-MMM-yyyy');", cn, adOpenKeyset, adLockOptimistic

Результат должен возвращать из обеих таблиц сумму полей qty для этого диапазона дат. Я не могу сделать это правильно! Пожалуйста помочь.

Что я уже пробовал:

rs.Open "Select distinct format(SupplierInvoices.Date, 'dd-MMM-yyyy') as tDate, Sum(SupplierInvoices.QTY) as tTotal from SupplierInvoices, format(Sales.Date, 'dd-MMM-yyyy') as sDate, Sum(Sales.QTY) as sTotal from Sales where PLU = '" & lblPLU.Caption & "' and Date Between #" & StartTime & "# and #" & EndTime & "# Group by format(SupplierInvoices.Date, 'dd-MMM-yyyy');", cn, adOpenKeyset, adLockOptimistic

RedDk

Я вижу "rs.Open" и думаю, что тег отсутствует в коллекции, VBA, Excel или, возможно, Access. Но все равно ... на стороне SQL Server этого запроса SELECT DISTINCT etc, возможно, использование SQL Server Management Studio Express ускорит любое понимание таблицы и даты.

"Не могу сделать это правильно". Что? Нет данных в таблице. Нет способа получить данные из таблицы. Это не очень хороший пост, как есть.

Используйте виджет "улучшить вопрос", чтобы добавить к тому, что уже указано.

2 Ответов

Рейтинг:
2

OriginalGriff

Во-первых, почему вы дублируете информацию? Это плохая идея, которая приводит к проблемам, которые трудно исправить ... Я, вероятно, начну с того, что посмотрю на ваш дизайн данных и посмотрю, действительно ли эта структура имеет какой-то смысл.

Затем, как сказал Патрис Т, никогда не объединяйте строки для построения SQL - команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

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


Рейтинг:
1

Patrice T

rs.Open "Select distinct format(SupplierInvoices.Date, 'dd-MMM-yyyy') as tDate, Sum(SupplierInvoices.QTY) as tTotal from SupplierInvoices, format(Sales.Date, 'dd-MMM-yyyy') as sDate, Sum(Sales.QTY) as sTotal from Sales where PLU = '" & lblPLU.Caption & "' and Date Between #" & StartTime & "# and #" & EndTime & "# Group by format(SupplierInvoices.Date, 'dd-MMM-yyyy');", cn, adOpenKeyset, adLockOptimistic

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]