Sql server 仅当主表中有数据时才使用联接

Sql server 仅当主表中有数据时才使用联接,sql-server,join,case,sql-like,Sql Server,Join,Case,Sql Like,我有下面的场景 我有两张桌子 第一桌 SELECT * FROM #REVENUECODES PROCCODE -------- RA MA 第二桌 SELECT * FROM #REVENUECODESXYZ PROCCODE --------- RA123 MA325 MA582 XY123 YW123 例外结果 我需要在#REVENUECODESXYZ中搜索,它以(#

我有下面的场景

我有两张桌子

第一桌

SELECT * FROM #REVENUECODES

    PROCCODE
    --------
    RA
    MA
第二桌

SELECT * FROM #REVENUECODESXYZ

      PROCCODE
      ---------
      RA123
      MA325
      MA582
      XY123
      YW123
例外结果

我需要在
#REVENUECODESXYZ
中搜索,它以(
#REVENUECODES.PROCCODE
开头)

下面的查询给出了输出

SELECT 
    XY.PROCCODE 
FROM 
    #REVENUECODESXYZ  XY  
INNER JOIN 
    #REVENUECODES AB ON XY.PROCCODE LIKE (AB.PROCCODE+'%')
我明白了:

    PROCCODE
    --------
    RA123
    MA325
    MA582
这也是期望的输出

失败场景:

如果表
#REVENUECODES
中没有值,那么我应该获取
#REVENUECODESXYZ
中的所有数据,而这些数据现在没有发生。对于我的当前代码,如果
#REVENUECODES
中没有数据,则由于连接条件,我得到的结果为空

我正试着做这样的事情

SELECT 
    XY.PROCCODE 
FROM 
    #REVENUECODESXYZ  XY  
INNER JOIN
    #REVENUECODES AB ON ( (XY.PROCCODE LIKE (AB.PROCCODE+'%'))
                          or
                          (isnull(AB.PROCCODE, '') = '')
                         )

但是当
#REVENUECODES
为空时,这个查询什么也没有给我,当它应该给我
#REVENUECODESXYZ

中的所有内容时,抱歉,我最初没有正确阅读您的问题

结果集似乎有两个不同的选择“分支”-我能想到的最干净的方法是将两个结果合并在一起,并确保与
不存在的互斥性(如果RHS表没有行,
内部联接将不返回任何内容)


您使用的是一个内部联接,它只显示两个表之间匹配的数据。 如果要查看
#REVENUECODESXYZ
表中的数据,请使用左连接和右连接,反之亦然


对所有数据使用完全外部联接,即:内部联接+左侧联接+右侧联接。

使用
左侧联接
而不是
内部联接
。然后在第一种情况下,它将失败。我需要一个在这两种情况下都能工作的代码。你说:“那么我应该在#REVENUECODESXYZ中获取所有数据”。这是通过左连接实现的。您可能会忘记问题中的某些内容。抱歉,我的意思是,单个查询应该在两种情况下都能工作。不,在这种情况下,当我在(“#REVENUECODES”)中有数据时,我也会从(“#REVENUECODESXYZ”)获取所有数据,而不是获取过滤数据。@Rajesh抱歉,我没有正确阅读您的问题。我已经更新了。联合是一个单一的结果集。我尝试了这种连接,但在第一个场景中失败了,因为我在第一个表(REVENUECODES')中有数据。在本例中,我也从#REVENUECODESXYZ获取所有数据,而不是获取筛选数据。您无法在左外获取筛选(仅匹配)数据(它显示REVENUECODES中的数据和匹配数据),您必须根据您的情况更改联接
 SELECT XY.PROCCODE 
 FROM #REVENUECODESXYZ XY
    INNER JOIN #REVENUECODES AB on
     XY.PROCCODE like (AB.PROCCODE+'%')

UNION

 SELECT XY.PROCCODE
 FROM #REVENUECODESXYZ XY
 WHERE NOT EXISTS (SELECT 1 FROM #REVENUECODES)