在不使用' union'的情况下改进sql查询

时间:2014-11-18 15:37:07

标签: sql oracle oracle10g

我想在不使用UNION的情况下改进此SQL查询。当table_xx.uniqeId = 1时我想使用table_yy,当我想要使用table_ww时。事实上我想要这种动态。我想为uniqeId-table匹配使用另一个表,因为将来我可以为table_xx.uniqeId = 3添加额外的表,使用table_qq或其他。你能提出一些想法,我能用什么?

感谢。

SELECT
 xx.info,
 yy.value
FROM
 table_xx xx,
 table_yy yy
WHERE
 xx.uniqeId = 1

UNION ALL

SELECT
 xx.info,
 yy.value
FROM
 table_xx xx,
 table_ww yy
WHERE
 xx.uniqeId = 2

1 个答案:

答案 0 :(得分:0)

如果在{yy和ww中value是强制性的,那么就可以这样做。但就像Gordon Linoff已经评论过的那样,像这样的查询并不是必须表现得更好。最有可能的是它不会,而且它的可读性也更高。我会选择工会。

SELECT
  xx.info,
  nvl(yy.value, ww.value) as value
FROM
  table_xx xx
  LEFT JOIN table_yy yy ON xx.uniqeId = 1
  LEFT JOIN table_ww ww ON xx.uniqeId = 2
WHERE
  nvl(yy.value, ww.value) IS NOT NULL

但我认为如果引入一个额外的xx_id也需要一个额外的表,那么这表明你的数据库结构不正确。

更好的想法是将“uniqueid”添加到'值'表也​​是如此,因此您可以轻松地在xx上加入正确的值。这样,您可以根据需要添加额外的ID和匹配值,而无需修改数据库以添加额外的值表。

SELECT
  xx.info,
  yy.value
FROM
  table_xx xx
  INNER JOIN table_yy yy ON yy.xx_uniqueid = xx.uniqueid