2012-04-17 186 views
2

我有一个查询的问题,比如这一个我可以检索记录:SQL查询,不显示所有记录

SELECT 
l.*, 
ll.f_cocacola as cocacola, 
le.name AS deposit, 
lp.price 
FROM 
KPC AS l, 
KPC_cocacola AS ll, 
KPC_deposit AS le, 
KPC_price AS lp 
WHERE 
l.cod_deposit = le.id_deposit 
AND l.code = ll.code 
AND lp.code = l.code 
AND l.code_deposit = '002365' 

,但现在我需要包括从另一个表的另一日期-intranet-具有领域代码网址则需要从该表中网址秀场..记住,我们的关系就代码场。

,所以我更改查询,以这样的方式

SELECT l.*,ll.f_cocacola as cocacola, le.name AS deposit, 
lp.price, lintranet.url 
FROM tableX AS l, intranet_cocacola AS ll, tableX_deposit AS le, 
tableX_price AS lp, 
tableX_intranet as lintranet 
WHERE l.code_deposit = le.id_deposit 
AND l.code = ll.code 
AND lp.code = l.code 
AND l.code = lintranet.code 
AND l.code_deposit = '456852147' 

但问题是,一些记录没有网址,如果不存在网址那么这个查询不告诉我的记录..以及我所需要的,即使没有一个URL关联到我希望看到recorda的记录,由于

回答

3

使用ANSI连接语法和使用LEFT JOIN重写查询什么更好的画面:

SELECT l.*, ll.f_cocacola as cocacola, le.name AS deposit, 
     lp.price, lintranet.url 
FROM tableX AS l, 
JOIN intranet_cocacola AS ll 
ON  ll.code = l.code 
JOIN tableX_deposit AS le 
ON  le.id_deposit = l.code_deposit 
JOIN tableX_price AS lp 
ON  lp.code = l.code 
LEFT JOIN 
     tableX_intranet as lintranet 
ON  lintranet.code = l.code 
WHERE l.code_deposit = '456852147' 
+1

你的答案是相当更加清晰,我选择了这一个,我也给予好评的@zerkms回答 – hibigo 2012-04-17 23:15:28

2

使用LEFT JOIN代替:

SELECT l.*,ll.f_cocacola as cocacola, le.name AS deposit, 
lp.price, lintranet.url 
FROM tableX AS l, intranet_cocacola AS ll, tableX_deposit AS le, 
tableX_price AS lp 
LEFT JOIN tableX_intranet as lintranet ON l.code = lintranet.code -- <<<<< 
WHERE l.code_deposit = le.id_deposit 
AND l.code = ll.code 
AND lp.code = l.code 
AND l.code_deposit = '456852147' 

PS:我个人更喜欢明确的INNER JOIN,而不是使用逗号分隔的表枚举连接。因为它给出了查询确实

+0

两个答案都非常好,现在我不知道我可以选择你的名誉和Quassnoi :( – hibigo 2012-04-17 23:13:28

1

我知道你已经有一个答案,但我看到你的问题用Oracle数据库制作......而我认为LEFT JOIN的作品,因为它是STANDAR SQL,Oracle有它自己的版本,所以你可以看到这个相同的查询写成如下:

SELECT l.*,ll.f_cocacola as cocacola, le.name AS deposit, lp.price, lintranet.url 
    FROM tableX AS l, intranet_cocacola AS ll, tableX_deposit AS le, tableX_price AS lp, tableX_intranet as lintranet 
WHERE l.code_deposit = le.id_deposit 
    AND l.code = ll.code 
    AND lp.code = l.code 
    AND l.code_deposit = '456852147' 
    AND l.code = lintranet.code(+) //<-- this is how a left/right join is written 
            //on Oracle's SQL, you add "(+)" next to the 
            //field of the table that may not have 
            //matching records. 
+0

谢谢你,我也投了你的答案,是很好的一个..晚安 – hibigo 2012-04-17 23:23:56

+1

此语法'9i'及以上 – Quassnoi 2012-04-18 08:57:38

+0

弃用@Quassnoi真的吗?不知道......强硬,我更喜欢它! – 2012-04-18 10:21:23