我知道这个问题的标题可能有点不准确,但我无法想出更好的东西。遗憾。
我必须获取2个不同的字段,一个始终存在,另一个不存在。这意味着我正在看 LEFT JOIN 。好到目前为止。
但我要显示的行是不存在不确定的行。
我想做点什么:
显示名称和图片,但仅在名称具有 picture_id 时显示图片。否则不显示图片,但我仍然想要名称(左连接)。
我知道这可能有点令人困惑但是这里有一些聪明的人,所以我想有人会理解它。
我尝试了一些方法,但我无法在SQL中说出我想要的内容。
P.S。特定于 Oracle 的解决方案也很好。
-------------------------------------------- -------------------------------------------------- --------------------------------------
编辑我尝试了一些查询,但我发现的主要问题是,在 ON 子句中,我只能引用上面提到的最后一个表,也就是说: 有四个表我正在检索数据,但我只能提到 LEFT JOIN 的 on 子句中的最后一个(第三个表)(这是第四个)表)。我希望这些表格能有所帮助。尽量不要在名字上钻研太多,因为它们是葡萄牙语:
有4张桌子。对于给定的TB395.dsclaudo
,我要检索的字段为:TB397.dscrecomendacao
和TB392.nronip
。表格如下:
TB392(laudoid,nronip,codlaudo)
// laudoid是PK,引用TB395
TB395(codlaudo,dsclaudo)
// codlaudo是PK
TB398(laudoid,codrecomendacao)
//对laudoid,codrecomendacao是PK,引用TB397
TB397(codrecomendacao,dscrecomendacao)
// codrecomendacao是PK
具有相同名称的字段是外键。
问题是,对于给定的laudoid
,无法保证会有一个codrecomendacao
。但是,如果是,我希望返回dscrecomendacao
字段,这就是我不知道该怎么做。但即使不是 codrecomendacao
的相应laudoid
,我仍然想要dsclaudo
字段,这就是为什么我认为 LEFT JOIN 适用。
答案 0 :(得分:2)
听起来你希望你的主要行源是TB392和TB395的连接;然后你想要一个外连接到TB398,当得到匹配时,你想在TB397中查找相应的值。
我建议将主要连接编码为一个内联视图;两个额外表之间的连接作为第二个内联视图;然后在它们之间进行外连接。类似的东西:
SELECT ... FROM
(SELECT ... FROM TB392 JOIN TB395 ON ...) join1
LEFT JOIN
(SELECT ... FROM TB398 JOIN TB397 ON ...) join2
ON ...
答案 1 :(得分:1)
如果您可以指定表是什么,哪些列在哪些表上以及它们加入哪些列,那将是很好的。不清楚你有两张桌子还是只有一张桌子。我猜你有两张桌子,因为你说的是LEFT JOIN
,似乎暗示连接在name
列上。因此,您可以使用NVL2
函数来完成您想要的任务。所以猜测我可以从你的问题中得到什么,也许是这样的:
SELECT T1.name
, NVL2( T2.picture_id, T1.picture, NULL )
FROM table1 T1
LEFT JOIN
table2 T2
ON T1.name = T2.name
如果你只有一张桌子,那就更简单了
SELECT T1.name
, NVL2( T1.picture_id, T1.picture, NULL )
FROM table1 T1
答案 2 :(得分:1)
我认为你需要:
SELECT ...
FROM
TB395
JOIN
TB392
ON ...
LEFT JOIN --- this should be a LEFT JOIN
TB398
ON ...
LEFT JOIN --- and this as well, so the previous is not cancelled
TB397
ON ...
细节可能不准确:
SELECT
a.dsclaudo
, b.laudoid
, c.codrecomendacao
, d.dscrecomendacao
FROM
TB395 a
JOIN
TB392 b
ON b.codlaudo = a.codlaudo
LEFT JOIN
TB398 c
ON c.laudoid = b.laudoid
LEFT JOIN
TB397 d
ON d.codrecomendacao = c.codrecomendacao
答案 3 :(得分:1)
创建两个视图,然后在视图上进行左连接。例如:
Create View view392_395 as SELECT t1.laudoid, t1.nronip, t1.codlaudo, t2.dsclaudo FROM TB392 t1 INNER JOIN TB395 t2 ON t1.codlaudo = t2.codlaudo Create View view398_397 as SELECT t1.laudoid, t1.codrecomendacao, t2.dscrecomendacao FROM TB398 t1 INNER JOIN TB397 t2 ON t1.codrecomendacao = t2.codrecomendacao SELECT v1.laudoid, v1.nronip, v1.codlaudo, v1.dsclaudo, v2.codrecomendacao, v2.dscrecomendacao FROM view392_395 v1 LEFT OUTER JOIN view398_397 v2 ON v1.laudoid = v2.laudoid
在我看来,观点总是被使用。意见是你的朋友。它们可以简化一些最复杂的查询。