Стол соединился - И ГДЕ - PullRequest
       6

Стол соединился - И ГДЕ

0 голосов
/ 05 октября 2011

Я присоединился к таблицам так же, как результат здесь: http://www.w3schools.com/sql/sql_join_left.asp

LastName    FirstName   OrderNo
Hansen      Ola         1
Hansen      Ola         2
Hansen      Ola         3
Pettersen   Kari        8
Pettersen   Kari        9
Svendson    Tove     

Как найти список людей (LastName, FirstName), с которыми связаны оба заказа 1 и 2.

Ответы [ 6 ]

3 голосов
/ 05 октября 2011

Другие ответы сказали вам убрать второе WHERE.

Они не сказали, что если вы ищете обе записи 1 и 2, вам нужно будет использовать OR, а не AND. Задать AND не удастся, потому что запрос будет искать одну запись, соответствующую обоим критериям, что, конечно, невозможно в этом случае.

Итак, ваше предложение WHERE должно выглядеть так:

WHERE OrderNo = 1 OR OrderNo = 2
2 голосов
/ 05 октября 2011

убрать второе ГДЕ

WHERE OrderNo = 1 OR OrderNo = 2

ИЛИ

WHERE OrderNo IN (1,2)
1 голос
/ 05 октября 2011

Во-первых, не пишите WHERE дважды.Вам разрешено только одно предложение WHERE на SELECT.

Во-вторых, у вас не может быть строки, где OrderNo = 1 AND OrderNo = 2.Невозможно, чтобы оба они были правдой одновременно.Используйте OR вместо AND:

WHERE OrderNo = 1
OR OrderNo = 2

В этом случае вы можете просто использовать IN :

WHERE OrderNo IN (1, 2)
0 голосов
/ 06 октября 2011

Я предполагаю, что вам нужны имена людей, у которых есть оба заказа 1 и 2.

Вы можете использовать этот запрос:

SELECT LastName, FirstName 
FROM MyTable 
WHERE OrderNo IN (1, 2)
GROUP BY LastName, FirstName
HAVING COUNT(*) = 2

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

0 голосов
/ 05 октября 2011
WHERE OrderNo = 1
AND WHERE OrderNo = 2

Ваша спецификация очень краткая.

Реляционный эквивалент вышеприведенного AND может быть UNION, например.

SELECT * 
  FROM Orders
 WHERE OrderNo = 1
UNION
SELECT * 
  FROM Orders
 WHERE OrderNo = 2;

Возможно, оператор отношения - это деление, то есть возвращаемое имя любого человека с порядковыми номерами 1 и 2, например

SELECT DISTINCT LastName, FirstName
  FROM Orders AS O1
 WHERE NOT EXISTS (
                   SELECT OrderNo
                     FROM (VALUES (1), (2)) AS Divisor (OrderNo)
                   EXCEPT
                   SELECT OrderNo
                     FROM Orders AS O2
                    WHERE O2.LastName = O1.LastName
                          AND O2.FirstName = O1.FirstName
                  );

Но я, скорее, подозреваю, что вы имели в виду логическое ИЛИ, а не логическое И (я знал, что бизнес-аналитик, который писал sepcs со словом 'и' на естественном языке, означал логическое ИЛИ, например, "Это могло бы быть так и могло бы быть") например

SELECT * 
  FROM Orders
 WHERE (OrderNo = 1 OR OrderNo = 2);

В SQL есть хороший синтаксический сахар для этого:

SELECT * 
  FROM Orders
 WHERE OrderNo IN (1, 2);
0 голосов
/ 05 октября 2011

Взяв полный пример (с явной таблицей. Поле для удобства чтения):

Select persons.LastName, persons.FirstName, orders.OrderNo
FROM Persons
LEFT JOIN Orders order1 ON persons.P_Id=orders1.P_Id
LEFT JOIN Orders order2 ON persons.P_Id=orders2.P_Id
where (orders.OrderNo = 1 or orders.OrderNo = 2

Очень важно быть очень явным при работе с объединениями, чтобы вы (и разработчики после вас) не запутались.Не предоставляя таблицу. Поле также выдаст ошибку, если две таблицы имеют поля с одинаковым именем.

Обновление

Из комментария к другому ответу:

ИЛИ работает, но не так, как мне бы хотелось.Мне нужно получить запись, которая имеет OrderNo = 1 И OrderNo = 2. Оба значения 1 и 2 вместе.Если я использую ИЛИ, он вернет мне записи, которые имеют одно из этих значений или два

Если я правильно читаю это, вы ищете только заказы, которые отправляются повторным людям (Персона)?Если это так, то это поможет:

Select DISTINCT orders1.OrderNo, persons.LastName, persons.FirstName
FROM Persons 
LEFT JOIN Orders orders1 
  ON persons.P_ID = orders1.P_ID
LEFT JOIN Orders orders2 
  ON persons.P_ID = orders2.P_ID
Where orders1.P_ID = orders2.P_ID

Если вы хотите, чтобы заказы были только для одного конкретного человека, это другой запрос вместе

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