2011-10-05 42 views
0

我加入的表一样,这里的结果: http://www.w3schools.com/sql/sql_join_left.asp连接的表 - 和WHERE

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

我怎样才能找到具有与之相关的两个订单1和2人(姓,名)名单。

+2

不要使用w3schools,这不是一个好资源,请参阅:http://w3fools.com – Johan

回答

2

删除第二个WHERE

WHERE OrderNo = 1 OR OrderNo = 2 

OR

WHERE OrderNo IN (1,2) 
+2

AND'是错误的。它应该是一个'OR'。 – Spudley

+0

是好斑点。我已经更新了我的答案。 – DaveHogan

+0

好的。我已经删除了我的-1。 :)(让我感到惊讶的是,三个单独的答案都犯了同样的错误!他们现在都被纠正了,但肯定有某种集体失明发生) – Spudley

1

首先,不写WHERE两次。根据SELECT,您只能获得一个WHERE条款。

其次,你不能有一行OrderNo = 1 AND OrderNo = 2。这两个都不可能同时成立。使用OR代替AND

WHERE OrderNo = 1 
OR OrderNo = 2 

在这种情况下,你可以只使用IN

WHERE OrderNo IN (1, 2) 
0

完全占据例子(与可读性明确table.Field):

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 

在使用连接时非常明确地表示重要,以便您(以及后面的开发人员)不会感到困惑。不提供table.Field也会抛出错误,如果两个表具有相同名称的字段。

更新

从另一个回应评论:

或作品,但无论怎样我都会喜欢。我需要得到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 

如果你只想要下单有一个单一的,特定的人,这是一个不同的查询一起

3

其他答案告诉你删除第二WHERE

他们没有说的是,如果您要查找记录1和2,则需要使用OR而不是AND。指定AND将会失败,因为查询会查找符合两个条件的单个记录,在这种情况下这当然是不可能的。

所以你WHERE条款应该是这样的:

WHERE OrderNo = 1 OR OrderNo = 2 
+0

或有效,但没有我想要的。我需要得到OrderNo = 1和OrderNo = 2的记录.1和2都一起计算。如果我使用OR,它会返回具有其中一个或两个值的记录。 – swoorn

+1

@ user955399,如果你想要一些非常具体的东西,请编辑问题以列出你想要的确切结果。 _(最好以表格的形式,就像你的问题中的table1一样)_ – Johan

+0

@ user955399 - 同意;这个问题真的不清楚,这是你想要的。要在单个查询中实现这一点,您需要彻底改变您加入表格的方式。就目前来看,你没有一个OrderNo = 1和= 2的记录;你有两个记录。可以重写查询以将两个订单号码放入同一记录中,但这可能不是一种明智的做法。仅仅收集匹配的两条记录并在SQL之外显示/处理它们以满足您的需求就容易得多。 – Spudley

0
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

我假设你希望谁同时拥有订单1和2

您可以使用此查询的人的名字:

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

注:我假设你不会有确切的重复记录,如果你这样做需要首先消除重复。