【问题标题】:Reproduce conditional LEFT JOIN behavior in WHERE?在 WHERE 中重现条件 LEFT JOIN 行为?
【发布时间】:2012-12-14 07:44:05
【问题描述】:

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

我正在为数据库应用程序做一些优化。有一种方法(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

感谢您的帮助!

【问题讨论】:

  • 您希望将AB 都单独发送给客户端,然后让客户端加入?
  • 你如何在客户端进行连接/过滤,这是如何在 LINQ 中进行左连接 stackoverflow.com/questions/700523/linq-to-sql-left-outer-join
  • 我一直在寻找服务器端解决方案(在 SELECT 或 WHERE 中),但是是的,我认为我不会选择分别检索 A 和 B 并在客户端进行连接,是我对吗?
  • @m6a-uds 我无法理解您想要完成的任务。
  • 如何使用所有已知“SOME_OTHER_KEY”类型值的派生列表加入一个附加连接?然后,您可以在调用 Method_A 之前取回所有可能性。 INNER JOIN (SELECT distinct some_key from some_key_table) keys LEFT JOIN B on A.fk=B.fk AND B.a = keys.some_key

标签: c# sql database optimization sybase


【解决方案1】:

你可以试试这个,基本上把有不匹配的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)
  • A(fk,c)

【讨论】:

  • 抱歉耽搁了,我在周末。如果已知“SOME_KEY”,则此解决方案有效,但我想加载 SOME_KEY 的所有可能值...抱歉,现在我考虑了一段时间,在我的情况下它可能在技术上不可行。 :-/ 好吧,我想这毕竟是一个糟糕的问题......
猜你喜欢
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多