3

需要在 Oracle 和 SQL 服务器之间与数据库无关,尽管我也不介意听到特定于 SQL 服务器的示例。

我确定标题根本不清楚,所以让我解释一下我的想法。我在想两个问题。第一个可能会从给定表中提取一堆数据,包括主键。第二个只会拉入每个主键并将所有其他列留空。

然后我想以这样一种方式将它们联合在一起,即每当第一个查询中缺少主键时,第二个查询中的行就会被拉入。否则,如果主键存在于第一个查询中,则来自的行第二个查询被忽略。

快速示例:

第一个查询拉入两列(第一列是主键):

1   1

2   1

第二个查询拉进来:

1   NULL

2   NULL

3   NULL

所以我希望整个查询都可以加入:

1  1

2  1

3  NULL

在性能方面,实现这一目标的最佳方法是什么?考虑一个示例,其中可能有大量的行和列,并且第一个查询可能非常耗费性能(尽管第二个当然应该总是很简单,只需从列表中提取主键并填充其余部分列输出为 NULL 或静态值)。

4

2 回答 2

2

在我看来,您想FULL OUTER JOIN在两个表或查询上使用 a :

select 
  coalesce(q1.col1, q2.col1) col1,
  coalesce(q1.col2, q2.col2) col2
from query1 q1
full outer join query2 q2
  on q1.col1 = q2.col1;

请参阅SQL Fiddle with Demo

这将连接主键列上的两个查询(col1在示例查询中),然后您可以COALESCE在列上使用返回第一个非空值col1,col2等。

于 2013-09-24T22:40:05.553 回答
1

您不能使用联合,因为 SQL 会认为 1、2 和 1、NULL 是不同的。

不知道您的架构,我会在伪代码中尝试以下操作:

select *
from query_1
union all
select primary_key
from query_2
where query_2.PK not in(select PK from query_1)

这只会返回 query_2 中不在 query_1 中的主键,并为您提供一个干净的联合,其中 query_1 结果优先于 query_2 结果。只为第一个查询选择主键应该既快速又简单,但如果不是这种情况,请告诉我,我可以尝试根据您的架构提出更复杂的查询。

于 2013-09-24T22:40:43.513 回答