2014-09-03 141 views
0

我试图连接两个表ORDER和ORDER_FLG。我想从ORDER中取出ORDER_FLG表中没有Flg为'Y'的所有列。左连接 - 连接两个表并从左表中拉出所有数据

ORDER

Branch_nbr |Order_Id | Order_start_dt |Order_end_dt 
0001 | 110000 | 01/01/2014 | 02/02/2014 
0002 | 110001 | 03/03/2014 | 04/04/2014 
0003 | 110002 | 05/05/2014 | 06/06/2014 

ORDER_FLG

Branch_Nbr |Order_Id |Flg 
0001 | 110000| Y 
0003 | 110002| N 

SQL:

SELECT A.* 
FROM ORDER AS A LEFT JOIN ORDER_FLG AS B 
ON A.Branch_nbr=B.Branch_nbr AND A.Order_Id=B.Order_Id 
WHERE A.Order_start_dt >= 'SOME_DATE' 
AND A.Order_end_dt <= 'SOME_DATE' 
AND B.Flg <> 'Y' 

我应该得到两行(110002,110001)的输出,但我得到的只有一个。如果第二个表中不存在条目,则数据不会从第一个表中提取。不应该从第一个表中拉出所有数据?

我尝试这样做,它的工作原理,但需要时间 -

SELECT A.* 
FROM ORDER AS A 
WHERE A.Order_start_dt >= 'SOME_DATE' 
AND A.Order_end_dt <= 'SOME_DATE' 
AND A.Order_Id NOT IN (SELECT Order_Id FROM ORDER_FLG 
WHERE Order_Id=A.Order_Id AND Branch_nbr=A.Branch_nbr 
AND Flg='Y') 
+0

嗨。任何答案都有帮助吗?如果是的话,你应该接受它:) – PawelP 2014-09-13 11:34:05

回答

1

你的where子句中包括你的外部表的引用: AND B.Flg <> 'Y'

这where子句外后应用加入。来自外连接表的没有匹配的行将在结果集中有空值。 Null与您的约束不匹配,因此行将从结果集中删除。

Try this instead: 
SELECT A.* 
FROM ORDER AS A LEFT JOIN ORDER_FLG AS B 
ON A.Branch_nbr=B.Branch_nbr AND A.Order_Id=B.Order_Id 
AND B.Flg <> 'Y' 
WHERE A.Order_start_dt >= 'SOME_DATE' 
AND A.Order_end_dt <= 'SOME_DATE' 
1

试试这个:

SELECT A.* 
FROM ORDER AS A LEFT JOIN ORDER_FLG AS B 
ON A.Branch_nbr=B.Branch_nbr AND A.Order_Id=B.Order_Id 
WHERE A.Order_start_dt >= 'SOME_DATE' 
AND A.Order_end_dt <= 'SOME_DATE' 
AND (B.Flg IS NULL OR B.Flg <> 'Y') 

的B.Flg <> 'Y' 的条件是那些在ORDER_FLG没有匹配的行所有的订单显然是错误的。你在这些字段中得到一个NULL,所以你必须在WHERE子句中允许这种可能性。

+0

这是一个很好的解决方案。另一种方法是,如果您不关心如何在ORDER_FLG表中添加数据,则将'B.Flg ='Y'添加到此连接条件中,并仅用'B.Flg IS NULL'完成WHERE子句 – ludwigmace 2014-09-03 17:02:25