下午好,
我遇到了两个我试图加入的桌子的问题。
我要做的是,我必须打印一张表格,其中包含在某些议程中注册的所有产品(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中增加了一些价格的产品。
我必须返回一个表,包括第一个查询中的所有记录,如果在第二个查询中有一些价格,我必须"连接"它们。
提前致谢。
答案 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来解决。