SQL-запрос из 2 таблиц для условия соответствия

Я столкнулся с проблемой найти правильный SQL-запрос. Я отдыхаю, вызов API

/order?[customerID=][year=][address=][item=][country=]

и мне нужно выполнить sql-запрос, чтобы вернуть порядок (идентификатор заказа, описание порядка) на основе значений в URL-адресе. В БД у меня 2 таблицы

Таблица 1

customerName
customerID
year
orderID
orderDesc
country

Таблица 2

customerName
customerID
year
address
item
quantity
orderID

Мне нужно получить orderID и orderDesc из Table1, которые удовлетворяют условию, что customerID, year, country равны значениям, как URL в Table1, а также customerID, year, address, item в Table2 (имейте в виду, что orderID должен быть таким же). Это возможно. Я новичок в SQL и изо всех сил пытаюсь найти решение. Любая помощь будет высоко ценится

Адрин

Две ваши таблицы не нормализованы. Возможно, вы захотите прочитать о нормализации, прежде чем продолжить.

Tim Biegeleisen 03.12.2018 15:19

Да правда. Но, к сожалению, текущая база данных - это то, что я не могу изменить :(

AJ007 03.12.2018 15:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это очень просто:

select t1.orderID, t1.orderDesc
from Table1 t1
inner join Table2 t2 on t1.orderID=t2.orderID and t1.customerID=t2.customerID and t1.year=t2.year
Where t2.address=@address and t1.year=@year and t1.customerID=@customerID and t2.item=@item and t1.country=@country

Вы должны объявить вары или создать хранимую процедуру.

Для этого customerID должен быть одинаковым в обеих таблицах, условие находится в "ON" после внутреннего соединения.

Спасибо за быстрый ответ. Я пробовал этот вариант, похоже, что «on t1.orderID = t2.orderID» не сработало. потому что результат показывал orderDesc и orderId всех других комбинаций. т.е. у меня в результате разные идентификаторы заказа. Но я считаю, что все другие комбинации сработали

AJ007 03.12.2018 16:02

Вы можете попробовать выбрать t1.orderID, t1.orderDesc, t2.orderID, чтобы убедиться, что оба «orderID» равны.

Jonathan Andujo 03.12.2018 16:08

Вы были правы .. У обеих таблиц одинаковый ID. Похоже, что условия удовлетворяют большему количеству случаев с другим идентификатором. Спасибо, в любом случае. Вы спасли мне день, и я отмечаю это как правильный ответ. Если вы думаете, что это хорошо, ответьте и на мой вопрос;)

AJ007 03.12.2018 16:19

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

    SELECT t1.OrderID, t1.ORderDesc
    FROM Table1 AS t1
INNER JOIN Table2 AS t2 
ON t1.OrderID = t2.OrderID
WHERE t1.CustomerID = @CustomerID
AND t2.CustomerID = @CustomerID
AND t1.Year = @Year
AND t2.Year = @Year
AND t1.Country = @Country
AND t2.Address = @Address
AND t2.Item = @Item

Где @Item, @Year, @Country и @CustomerID - параметры для значений, извлеченных из URL-адреса.

Надеюсь, это поможет :)

Да. Спасибо, Жан. Как @Jonathan ответил первым, я помечаю его как принятый. но ваш ответ тоже правильный и хорошо представлен. бухает за это. Спасибо за уделенное время

AJ007 03.12.2018 16:22

Ха-ха пропустил на секунду

Jean-Vicente De Carvalho 04.12.2018 07:51

Вы можете ОБЪЕДИНЯТЬ обе таблицы и использовать предложение WHERE для фильтрации результатов на основе параметров, полученных API.

Однако, пожалуйста, не обращайте внимания на то, что это довольно некрасиво ... кажется, что между двумя таблицами есть много избыточной информации, и, как прокомментировал @TimBiegeleisen, вам лучше сначала нормализовать свои структуры данных; это сделало бы логику такого запроса намного чище.

select
    a.customerID,
    a.orderDesc
from table1 a
join table2 b 
    on b.orderID = a.orderID
    and b.customerName = a.customerName
    and b.year = a.year
    and b.customerID = a.customerID
where
    a.customerID = :CUSTOMERID 
    and a.year = :YEAR
    and b.address = :ADDRESS
    and b.item = :ITEM
    and a.country = :COUNTRY

Да. Спасибо. Как @Jonathan ответил первым, я помечаю его как принятый. но ваш ответ тоже правильный и хорошо представлен. бухает за это спасибо за ваше время

AJ007 03.12.2018 16:22

Другие вопросы по теме