Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将两个具有不同值的查询合并到一列中,并对第一个查询进行优先级排序的最佳方法是什么?_Sql_Sql Server_Performance_Oracle - Fatal编程技术网

Sql 将两个具有不同值的查询合并到一列中,并对第一个查询进行优先级排序的最佳方法是什么?

Sql 将两个具有不同值的查询合并到一列中,并对第一个查询进行优先级排序的最佳方法是什么?,sql,sql-server,performance,oracle,Sql,Sql Server,Performance,Oracle,Oracle和SQL server之间需要不依赖数据库,尽管我也不介意听一些SQL server特定的示例 我肯定标题一点也不清楚,所以让我解释一下我的想法。我在想两个问题。第一种方法可以从给定的表中提取一组数据,包括主键。第二种方法只是拉入每个主键,并将所有其他列留空 然后,我希望以这样一种方式将它们合并在一起:每当第一个查询中缺少主键时,第二个查询中的行就会被拉入。否则,如果第一个查询中存在主键,则忽略第二个查询中的行 快速示例: 第一个查询拉入两列第一个是主键: 1 1 2 1

Oracle和SQL server之间需要不依赖数据库,尽管我也不介意听一些SQL server特定的示例

我肯定标题一点也不清楚,所以让我解释一下我的想法。我在想两个问题。第一种方法可以从给定的表中提取一组数据,包括主键。第二种方法只是拉入每个主键,并将所有其他列留空

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

快速示例:

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

1   1

2   1
第二个查询:

1   NULL

2   NULL

3   NULL
因此,我希望整个查询都能得到支持:

1  1

2  1

3  NULL

从性能角度看,实现这一目标的最佳方法是什么?考虑一个例子,其中可能有大量的行和列,第一个查询可能是相当密集的,尽管第二个当然应该是直截了当的,只需从列表中提取主键,并用空值或静态值填充其余列。

我觉得您希望在两个表或查询中使用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;


这将加入两个查询,在样本查询中的主键列COL1,然后可以使用列上的合并来返回COL1、COL2等的第一个非空值。

< P>不能使用一个联合,因为SQL将考虑1, 2和1,NULL是不同的。 由于不知道您的模式,我将在psuedo代码中尝试以下操作:

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

这将只返回查询_2中不在查询_1中的主键,并获得一个干净的联合,其中查询_1结果的优先级高于查询_2结果。仅为第一个查询选择主键应该是快速而简单的,但如果不是这样,请告诉我,我可以根据您的模式尝试提出一个更复杂的查询。

我喜欢这种方法,但不喜欢速度较慢的方法。sql server和oracle都支持减号关键字,因此部分可以是查询中的query_2.pk从查询中选择pk减去从查询中选择pk_1@DanBracuk这是真的。不确定他的数据是否能更快地运行,但这是有机会的。但是,减号仅适用于Oracle,SQL Server除外。所以我想到了这一点,但正如我上面所说的,查询1可能需要非常高的性能,现在我们要运行它两次,再加上执行not in。@JS我希望只选择主键会很好而且很快。如果不是,试试蓝脚的解决方案。如果这不起作用,让我们知道,我们可以考虑一个公共表表达式或一个临时表。这将使您可以缓存查询_1的结果,并从not in的临时表中恢复数据,而不是运行两次。SSIS查找转换可能是一种很好的方法。它可以比较数据源并根据条件选择数据。SSIS Oracle Attunity向Oracle或从Oracle加载数据的速度非常快,但它需要Enterprise SQL edition。通过链接服务器的速度会非常慢。相关人员:哦,我喜欢。谢谢