-5
Table1
column1 || column1Name
=======================
udf1    || Name1
udf2    || Name2


Table2
column1 || udf1   || udf2
================
key1    || value1 || value2

要求是编写查询,根据以 value1 传递的 Name1 来查找 key1。我可以使用动态 sql 编写它,但在大型记录集的情况下其性能太低。请建议编写sql查询的乐观方式。

4

1 回答 1

0

虽然开始的例子很糟糕,但随着您发布更多问题,您会及时到达那里。拥有更真实的数据(良好的开端)并显示预期输出也是一件好事,而不是基于评论。

无论如何,我不知道有多少“udf”(推断是用户定义的字段),我会在每列上都有一个索引。我正在运行从Table1(别名t1)开始的查询,并根据table1中的值根据每个相应的“udf”列多次加入table2 ...此外,每个左连接也将'value1'应用为这就是你要找的。'value1' 可能存在于任何可能的 table2 别名连接中。

WHERE 子句特定于您要查找的“名称”,UDF1 和 2 表的以下 AND NOT(为 null / 为 null )意味着我只希望在任一别名实例具有匹配...如果没有,忽略记录。

最后,通过COALESCE()的字段选择,我知道两个viaUDF别名中的一个会匹配,所以先通过UDF1抓取Column1 ...如果为null,则从viaUDF2抓取Column1

SELECT
      coalesce( viaUDF1.Column1, viaUDF2.Column1 ) as ReturnedKey
   from
      Table1 T1
      left join Table2 viaUDF1
         ON T1.Column1 = viaUDF1.udf1
         AND viaUDF1.udf1 = 'value1'
      left join Table2 viaUDF2
         ON T1.Column1 = viaUDF2.udf2
         AND viaUDF2.udf2 = 'value1'
   where
          T1.Column1Name = 'Name1'
      AND NOT (    viaUDF1.udf1 IS NULL 
                OR viaUDF2.udf2 IS NULL )

现在,如果您有 10 个以上的 UDF 列,那么所有的赌注都是为了性能,您必须以类似的方式左连接到每个实例,因为您不能内联连接到基于查询的表(我见过),而无需通过 Dynamic-SQL 进行。

于 2013-07-24T18:45:38.337 回答