我有一个问题,现在我没有想法。
我正在为数据库应用程序做一些优化。有一种方法(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
感谢您的帮助!
答案 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'
)
请注意,您需要以下索引: