Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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
C# 在何处重现条件左连接行为?_C#_Sql_Database_Optimization_Sybase - Fatal编程技术网

C# 在何处重现条件左连接行为?

C# 在何处重现条件左连接行为?,c#,sql,database,optimization,sybase,C#,Sql,Database,Optimization,Sybase,我有一个问题,现在我的想法 我正在为数据库应用程序做一些优化。有一种方法被调用了几百次,用于执行此类查询: 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][ ali

我有一个问题,现在我的想法

我正在为数据库应用程序做一些优化。有一种方法被调用了几百次,用于执行此类查询:

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'] 
为了优化我的代码,我想做的是在方法_a之前发出一个请求,检索所有数据,并使方法_成为一个过滤客户端。它是在.NET中编码的,我正在用数据集替换OLEDB连接

我怎么会做出这种行为?因为如果我使用客户端条件进行筛选,而不是在联接不返回任何内容的情况下获取“N/a”,我只会获取不到行,这是一个问题,因为我仍然需要val_a和val_b


谢谢你的帮助

您可以尝试这样做,基本上将存在不匹配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'
)
注意,您需要以下索引:

交流电 暂时离开键盘 Bfk Bfk,a Afk,c
您希望将所有A和B分别发送到客户端,然后让客户端执行联接?您如何执行联接/筛选客户端,这是如何在LINQ中进行左连接我在SELECT或WHERE中寻找服务器端解决方案,但是的,我想我没有选择分别检索a和B并在客户端进行连接,我说的对吗?@m6a uds我很难理解你想要完成什么。用所有已知的“SOME_OTHER_KEY”类型值的派生列表加入一个额外的连接怎么样?然后,在调用方法A之前,您可以返回所有的可能性。内部联接从表键中选择不同的某个键。表键左联接B在A.fk=B.fk和B.A=keys上。如果“SOME_KEY”已知,此解决方案有效,但我想加载SOME_KEY的所有可能值。。。对不起,现在我考虑了一会儿,在我的情况下,从技术上讲,这可能是不可能的嗯,我想这毕竟是个糟糕的问题。。。