在WHERE中重现条件LEFT JOIN行为?

时间:2012-12-13 18:08:09

标签: c# sql database optimization sybase

我有一个问题,现在我没有想法。

我正在为数据库应用程序做一些优化。有一种方法(Method_A)被称为几百次,可以进行这种查询:

SELECT 
A.a,
ISNULL(A.b, 'Nothing') As alias_b
ISNULL(B.a, 'N/A') as alias_c
FROM A
LEFT JOIN B on A.fk=B.fk AND B.a = 'SOME_KEY'
WHERE A.c = 'SOME_OTHER_KEY'

导致一行看起来像这样:

[a      ][alias_b][  alias_c  ]
[ val_a ][ val_b ][val_c|'N/A'] 

为了优化我的代码,我想做的是在Method_A之前发出一个请求,检索所有数据并使Method_A过滤器客户端。 (它用.NET编写,我用DataSet替换OleDBConnection)

我怎么能实现这种行为?因为如果我使用客户端条件进行过滤,而不是在连接没有返回任何内容的情况下获得'N / A',我只是没有行,这是一个问题,因为我仍然需要val_a和val_b

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

你可以试试这个,基本上分开两个不匹配的B元素的情况,当有匹配(并做一个内连接)时,也许它会有一个更清晰的执行计划:

(SELECT A.a,
        ISNULL(A.b, 'Nothing') As alias_b
        'N/A' as alias_c
 FROM A 
 WHERE A.c = 'SOME_OTHER_KEY' and
  not exists (select B.fk FROM B WHERE A.fk=B.fk AND B.a = 'SOME_KEY')
)
UNION ALL
(SELECT A.a
        ISNULL(A.b, 'Nothing') As alias_b
        B.a as alias_c
 FROM A, B
 WHERE A.c = 'SOME_OTHER_KEY' and 
       A.fk= B.fk and 
       B.a = 'SOME_KEY'
)

请注意,您需要以下索引:

  • A(c)中
  • A(FK)
  • B(FK)
  • B(FK,一个)
  • A(FK,C)