当某个表中的数据不可用时查询

Posted

技术标签:

【中文标题】当某个表中的数据不可用时查询【英文标题】:Query when data is not available in one of the table 【发布时间】:2020-05-31 17:09:12 【问题描述】:

我有 2 个表 A 和 B。我在表上使用了左连接,但是当左表 (A) 没有时,我想要查询返回右表值,其列与左表中的空白相同。

我使用了下面的查询,它对我来说工作正常。有没有更好的方法来构建相同的查询以提高性能

IF EXISTS(SELECT 1 FROM TableA WHERE Project_ID = @Project_ID)
    SELECT
        A.ID, A.Project_ID, A.Column1, A.Column2, 
        B.Column 
    FROM
        TableA A 
    LEFT JOIN
        TableB B ON A.Project_ID = B.Project_ID 
    WHERE
        A.Project_ID = @Project_ID
ELSE
    SELECT
        B.ID, B.Project_ID, '' As Column1, '' As Column2, B.Column 
    FROM
        TableB 
    WHERE
        project_ID = @Project_ID 

【问题讨论】:

是什么让您认为性能可以提高?您在寻找更快或更整洁的产品吗? 【参考方案1】:

如果我理解正确,你想要一个full join

select A.ID, A.Project_ID, A.Column1, A.Column2, B.Column
from (select a.*
      from TableA a
      where A.Project_ID = @Project_ID
     ) a full join 
     (select b.*
      from TableB b
      where b.Project_ID = @Project_ID
     ) b
     on a.Project_ID = b.Project_ID;

当使用full joins 进行过滤时,我通常发现使用子查询最明智。

【讨论】:

在这个示例中很难快速看到展示位置的“完全连接”。【参考方案2】:

你应该使用全连接:

SELECT
    ISNULL(A.ID,B.ID) AS ID
   ,ISNULL(A.Project_ID, B.Project_ID) AS Project_ID
   , A.Column1, A.Column2, B.Column 

FROM
    TableA A 

FULL JOIN
    TableB B ON A.Project_ID = B.Project_ID 

WHERE
    isnull(A.Project_ID ,B.Project_ID) =  @Project_ID

【讨论】:

以上是关于当某个表中的数据不可用时查询的主要内容,如果未能解决你的问题,请参考以下文章

当目的地不可用时如何停止使用骆驼路线中的消息

Android WifiP2p - 当发现的设备不可用时收到通知

使用适用于 iOS 的 XMPP 框架:当订阅者可用/不可用时接收状态

如何修复 PWA 审核中的“当 JavaScript 不可用时不提供后备内容”?

当原始存储库不可用时,是不是可以将默认存储库添加到 SLES?

歌曲不可用时的警报视图