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)