Получение условий для предложения WHERE из таблицы критериев - PullRequest
0 голосов
/ 24 января 2019

Я создал следующие простые DataModel:

enter image description here

И я заполнил таблицы следующими данными:

1) Таблица Заказчик

INSERT INTO test.customer
(CustomerName, Country, RegistrationDate)
VALUES 
("Customer A","DE","2015-05-03"),
("Customer B","US","2015-07-25"), 
("Customer C","US","2016-02-15"), 
("Customer D","DE","2017-09-21"), 
("Customer E","AU","2018-12-07");

2) Таблица Заказы

INSERT INTO test.orders
(idCustomer, PaymentMethod, OrderDate, OrderValue)
VALUES 
("1","CreditCard","2015-05-04","500"),
("1","PayPal","2015-11-18","200"), 
("3","PayPal","2017-09-04","300"), 
("2","Invoice","2018-04-30","100");

3) Таблица Критерии

INSERT INTO test.criterias
(Country, MinimumOrderValue)
VALUES 
("DE","300"),
("US","150"), 
("AU","200");

Впоследствии я создал запрос для получения Customers и их Orders на основе критериев Country и OrderValue:

SELECT 
test.customer.idCustomer, CustomerName, Country,
test.orders.OrderValue

FROM test.customer
LEFT JOIN test.customer_info ON test.customer.idCustomer = test.customer_info.idCustomer
LEFT JOIN test.orders ON test.customer.idCustomer = test.orders.idCustomer

WHERE 
Country = "US" AND OrderValue >= "150"
OR Country = "DE" AND OrderValue >= "300" 
OR country = "AU" AND OrderValue >= "200";

Пока все это работает отлично.


Однако вместо наличия критериев в предложении WHERE в запросе SQL они должны храниться в отдельной таблице Criterias.Затем запрос должен получить данные из этой таблицы и применить их точно так же, как это делается сейчас в запросе выше.

Что мне нужно изменить в моем коде, чтобы добиться этого?

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вы просто join таблицы или использовать подзапрос в предложении where.

Последний легче набрать, поэтому:

WHERE EXISTS (SELECT 1
              FROM Criterias cr
              WHERE cr.Country = c.Country AND
                    cr.MinOrderValue <=  o.OrderValue
             )
0 голосов
/ 25 января 2019

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

select c.cutomerId, c.customerName, c.country, o.orderValue from customer c, order o where  c.customerId = o.customerId and 
        exists (select * from criteria cr where cr.country = c.country and o.order >= cr.MinimumOrderValue)
0 голосов
/ 24 января 2019

Не обязательно ответ;слишком долго для комментария ...

Допустимый набор условий запроса может выглядеть следующим образом ...

 WHERE (country = "US" AND OrderValue >= 150)
    OR (country = "DE" AND OrderValue >= 300)
    OR (country = "AU" AND OrderValue >= 200);

... или действительно (хотя потенциально медленнее) ...

WHERE (country,ordervalue) IN(('US',150),('DE',300),('AU',200));
...