如果存在一个(另一个)行,如何获取相关行?

时间:2011-10-19 04:43:25

标签: sql oracle

我知道这个问题的标题可能有点不准确,但我无法想出更好的东西。遗憾。

我必须获取2个不同的字段,一个始终存在,另一个不存在。这意味着我正在看 LEFT JOIN 。好到目前为止。

但我要显示的行是存在不确定的行。

我想做点什么:

显示名称图片,但仅在名称具有 picture_id 时显示图片。否则不显示图片,但我仍然想要名称(左连接)。

我知道这可能有点令人困惑但是这里有一些聪明的人,所以我想有人会理解它。

我尝试了一些方法,但我无法在SQL中说出我想要的内容。

P.S。特定于 Oracle 的解决方案也很好。

-------------------------------------------- -------------------------------------------------- --------------------------------------

编辑我尝试了一些查询,但我发现的主要问题是,在 ON 子句中,我只能引用上面提到的最后一个表,也就是说: 有四个表我正在检索数据,但我只能提到 LEFT JOIN on 子句中的最后一个(第三个表)(这是第四个)表)。我希望这些表格能有所帮助。尽量不要在名字上钻研太多,因为它们是葡萄牙语:

有4张桌子。对于给定的TB395.dsclaudo,我要检索的字段为:TB397.dscrecomendacaoTB392.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 适用。

4 个答案:

答案 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

在我看来,观点总是被使用。意见是你的朋友。它们可以简化一些最复杂的查询。