我有table1:col1,col2,col3和table2:col1,col2,col3
我的目标是获得所有记录
where
t2.col1 like t1.col1 and
t2.col2 like t1.col2 and
t2.col3 like t1.col3
........................................
一个变体是内连接方法
select * from t2 inner join t1 on
t2.col1 like t1.col1 and
t2.col2 like t1.col2 and
t2.col3 like t1.col3
........................................
另一种变体是基于'其中'的存储过程。条款:
select * from t2
where t2.col1 like parameter1 and
t2.col2 like parameter2 and
t2.col3 like parameter3
然后我在VBA中调用该过程并使用for next循环来遍历excel table1中的所有值/参数
........................................
连接方法的执行时间比vba + sp方法慢(~20%,30%),但不幸的是,对于一大组参数,excel冻结。
........................................
是否可以应用循环方法并通过table1值,作为存储过程的参数,在sql server内部,sql脚本,没有vba或c ++或perl等?
我是无法访问db / tables设计的用户。
谢谢
答案 0 :(得分:0)
首先,问题中的两个问题不等同:
select * from t2 inner join t1 on
t1.col1 like t2.col1 and
t1.col2 like t2.col2 and
t1.col3 like t2.col3
这里有t1 like t2
select * from t2
where t2.col1 like parameter1 and
t2.col2 like parameter2 and
t2.col3 like parameter3
这是t2 like t1
的另一种方式。
最终结果会有所不同。
根据示例数据,它看起来应该是t2 like t1
。
您可以尝试使用CROSS APPLY
而不是JOIN
重新编写查询,但不太可能在性能方面有任何差异。
SELECT *
FROM
t1
CROSS APPLY
(
SELECT
FROM t2
WHERE
t2.col1 like t1.col1
and t2.col2 like t1.col2
and t2.col3 like t1.col3
) AS A
;
此查询结构模仿您的存储过程方法,对于t1
中的每一行,您从t2
中选择一组行。