SQL查询,不显示所有记录
问题描述:
我有一个查询的问题,比如这一个我可以检索记录: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的记录,由于
答
使用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'
答
使用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
答
我知道你已经有一个答案,但我看到你的问题用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.
你的答案是相当更加清晰,我选择了这一个,我也给予好评的@zerkms回答 – hibigo 2012-04-17 23:15:28