Является ли этот запрос SQL правильным? Я использую левое внешнее соединение - PullRequest
0 голосов
/ 21 апреля 2011

Используя тип объединения, верните имя, фамилию, номер заказа в записях клиентов, созданных после 1 ноября 2010 года. Включайте номера заказов в 3-й столбец, только если этот клиент разместил какие-либо заказы.

   SELECT c.firstname,
          c.lastname,
          o.ordernumber 
     FROM Customers c
LEFT JOIN Orders o ON c.customerid = o.customerid
    WHERE o.orderdate > '2010-01-01'
      AND o.ordernumber IS NOT NULL

Ответы [ 5 ]

1 голос
/ 21 апреля 2011

Это то же самое, что и внутреннее соединение.Пример:

SELECT c.firstname,
c.lastname,
o.ordernumber FROM   Customers c
Inner JOIN Orders o
ON     c.customerid = o.customerid
where o. orderdate > '01-01-2010'

должен возвращать те же результаты.LEFT JOIN используется, когда вы хотите вернуть CUSTOMER независимо от того, есть ли у них соответствующая запись ORDER.Если вам нужны только клиенты, у которых есть заказы, просто введите INNER JOIN.

Как указывает @Bryan, вы можете посмотреть, как конвертировать дату в соответствии с вашим форматом. Эта ссылка показывает, как конвертировать varchar в datetime в зависимости от формата.

0 голосов
/ 21 апреля 2011

Если под «записями клиентов» вы действительно подразумеваете «заказы клиентов», то, возможно, ваш запрос должен выглядеть следующим образом:

   SELECT c.firstname,
          c.lastname,
          o.ordernumber 
     FROM Customers c
LEFT JOIN Orders o ON c.customerid = o.customerid
      AND o.orderdate > '2010-01-01'
                  /* or '2010-11-01', if you want Nov 1, 2010 */

Это выведет всех клиентов.Третий столбец будет содержать NULL или номер заказа.

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

0 голосов
/ 21 апреля 2011

Это не правильно, условие WHERE будет оцениваться как ложное, если нет заказа, поэтому клиенты без заказов не будут включены (я предполагаю, что вы хотите, чтобы все клиенты, так как вы пишете «Включить номера заказов в 3-й столбец» только если этот клиент разместил какие-либо заказы. ", поэтому использование INNER JOIN, как считают другие, было бы неправильным).

Возможно, вы просто хотите сбросить условие o.ordernumber IS NOT NULL.

0 голосов
/ 21 апреля 2011

Без проверки этого, я думаю, вам не понадобится "и порядковый номер не равен нулю".

В итоге вы получите:

FirstName| LastName| OrderNumber
John       Smith     1
John       Smith     2
Joe        Bloggs    NULL     <-- Joe has no orders

То, что вы говорите ""Покажите мне всех и их заказы. Если у кого-то нет заказов, все равно покажите им "

0 голосов
/ 21 апреля 2011

LEFT OUTER JOIN приведет к строке для каждой строки в таблице Customer. Это лучше видно в статье вики . Использование INNER JOIN вернет строки только для клиентов, у которых есть соответствующие заказы.

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