SQL连接两个表和满足一个条件的元素

时间:2016-04-16 20:38:37

标签: sql postgresql join

下午好,

我遇到了两个我试图加入的桌子的问题。

我要做的是,我必须打印一张表格,其中包含在某些议程中注册的所有产品(codControl),因此该人可以投入其价格。

但首先我要研究 lctocotacao ,看看他是否已经为某些产品付出了代价。但是当我这样做的时候,我只是得到了一些有价格的产品,而其他的那些我看不到。

以下是我的表 cadprodutoscotacao

的示例
codProduct      desc      codControl
1               abc       197
2               cde       197
3               fgh       197
1               abc       198

我的桌子 lctocotacao

codProduct     price     codControl    codPerson
1              2.5000    197           19
2              3.0000    197           37
3              4.5000    198           37   

我现在有这个SQL语句:

SELECT cadc.cod, cadc.desc, lcto.codEnt, lcto.price
FROM cadprodutoscotacao cadc JOIN lctocotacao lcto
ON cadc.codControl = lcto.codControl
AND cadc.codProduct = lcto.codProduct
AND cadc.codControl = '197'
AND lcto.codPerson = '19'
ORDER BY cadc.codControl;

我得到了什么:

cod     desc     price     codPerson     codControl
1       abc      2.5000    19            197

我期待的表格

cod     desc     price     codPerson     codControl
1       abc      2.5000    19            197
2       cde                              197
3       fgh                              197

197和19将是我查询的参数。

关于如何进行的任何想法?

E D I T

基本上,我有两个问题:

SELECT *
FROM cadprodutoscotacao
WHERE cadc_codControl = '197'

首先,返回议程中注册的所有产品''。

第二个:

SELECT *
FROM lctocotacao
WHERE codPerson = 19
AND codControl = '197'

第二个返回已经由人物19在议程197中增加了一些价格的产品。

我必须返回一个表,包括第一个查询中的所有记录,如果在第二个查询中有一些价格,我必须"连接"它们。

Example

提前致谢。

3 个答案:

答案 0 :(得分:2)

您需要LEFT JOIN,但您还需要注意过滤条件:

SELECT cadc.cod, cadc.desc, lcto.codEnt, lcto.price
FROM cadprodutoscotacao cadc LEFT JOIN
     lctocotacao lcto
     ON cadc.codControl = lcto.codControl AND
        cadc.cod = lcto.cod AND
        lcto.codEnt = '19'
WHERE cadc.codControl = '197'
ORDER BY cadc_codigo;

LEFT JOIN会保留第一个表中的所有行,无论是否在ON条件中找到匹配项。这适用于第一个表格和第二个表格的条件。因此,您不希望在ON子句中的第一个表上放置过滤器。

规则是:在LEFT JOIN子句中的第一个表上使用WHERE个过滤器时。第二个表上的过滤器放在ON子句中(否则外连接通常会变成内连接)。

答案 1 :(得分:0)

您的行已被过滤,因为您指定了JOIN,这是INNER JOIN的快捷方式

如果您想要左表中的所有记录,即使他们在右表中没有相关记录,您也应该LEFT JOIN

SELECT cadc.cod, cadc.desc, lcto.codEnt, lcto.price
FROM cadprodutoscotacao cadc 
LEFT JOIN lctocotacao lcto
ON cadc.codControl = lcto.codControl
AND cadc.cod = lcto.cod
AND cadc.codControl = '197'
AND lcto.codEnt = '19'
ORDER BY cadc_codigo;

答案 2 :(得分:-1)

我不明白你的榜样。什么是主键? "鳕鱼"和" codentry"出现在两个表中。您的架构似乎非常多余。

但每当有人加入并缺少某些条目时,可以通过使用LEFT OUTER JOIN来解决。

相关问题