在不使用'的情况下改进sql查询;工会';

在不使用'的情况下改进sql查询;工会';,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我希望在不使用UNION的情况下改进此sql查询。当table_xx.uniqeId=1时,我想使用table_yy,当2时,我想使用table_ww。事实上,我想要这种动态。我想使用另一个表进行uniqeId表匹配,因为将来我可以添加额外的表,例如,对于表_xx.uniqeId=3,使用表_qq或其他一些。你能给我一些建议吗?我能用什么 谢谢 SELECT xx.info, yy.value FROM table_xx xx, table_yy yy WHERE xx.uniqeId

我希望在不使用UNION的情况下改进此sql查询。当table_xx.uniqeId=1时,我想使用table_yy,当2时,我想使用table_ww。事实上,我想要这种动态。我想使用另一个表进行uniqeId表匹配,因为将来我可以添加额外的表,例如,对于表_xx.uniqeId=3,使用表_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

如果在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也添加到“value”表中,这样您就可以轻松地在xx上加入正确的值。通过这种方式,您可以随意添加额外的ID和匹配值,而无需修改数据库以添加额外的值表

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

这些桌子有多大?为什么您认为删除
union all
将“改进”查询?这是一个多么奇怪的查询,基本上有两个交叉连接。也许你们应该给我们你们的实际查询,所以我们也有一些背景。我想你们的评论是在我编辑问题时写的。现在是清楚了还是我应该给你一些细节?我还是不明白你为什么要这么做。。。为什么不只包括table_ww和include uniqueId 1和2呢?事实上,这个查询是静态的。如果我想添加新表,我应该使用另一个union。但是我想从一个匹配表(uniqeId表)动态地完成它。这就是改进的原因。谢谢回复GolezTrol。很抱歉,我想我没有说我想要一个动态查询。这样,如果我想为uniqeId=3添加表_qq,我必须编辑查询。我可以用火柴台吗。这是可能的。是和否。在PLSQL中,您可以根据需要构建查询(作为字符串)并执行它。您不能仅在SQL中执行此操作。您不能仅仅根据额外表的名称来连接它们。但是我认为数据库结构是错误的,实际上应该在一个单值表中引入xx.uniqueid作为列。我试着给出一个例子,但很难给出一个好的例子并给出一个好的解释,因为'xx'和'yy'没有给出任何关于您实际用例的上下文。@BahadırYılmaz这能回答您的问题吗?我的主要目的是一次性编写sql查询,并且从不对其进行任何更改。查询将从另一个表中管理。如果uniqeId具有此值,请使用此视图,否则如果uniqeId使用此值,请使用此视图等。应仅启用向此表添加新记录。现在我从你的回答中了解到,这永远不会发生。所以我将使用您的建议,因为联接使查询更短,我喜欢短查询。谢谢