我有 2 个表:
客户
AccountId Cdescr other customer cols...
1000 ABC
分支
AccountId BranchId Bdescr other branch cols...
1000 1 AAA
1000 2 BBB
我找不到实现这一目标的方法
AccountId BranchId Cdescr Bdescr branchCols... customerCols...
1000 0 ABC NULL NULL VALUES...
1000 1 NULL AAA VALUES... NULL
1000 2 NULL ABC VALUES... NULL
默认情况下,客户表上缺少的 branchId 列应设置为 0。
我需要能够同时搜索 Cdescr 和 Bdescr,并且客户表上的每个匹配项都应该选择相关的分支。如果只在分支表上进行数学运算,则应选取相关的客户行
在分支 ID 上使用完全外部连接实际上不起作用
SELECT *
FROM (
SELECT *, 0 as branchId
FROM Customers
WHERE CONCAT(an_descr1, an_descr2) LIKE '%SEARCH_STRING%'
) a
FULL OUTER JOIN Branch d ON d.branchId = a.branchId
在当前查询中,im无法在分支表中搜索
试试这个:
DECLARE @tCust TABLE(
AccountId INT
,Cdescr NVARCHAR(10)
);
DECLARE @tBranch TABLE(
AccountId INT
,BranchId INT
,Bdescr NVARCHAR(10)
);
INSERT INTO @tCust VALUES(1000, 'ABC');
INSERT INTO @tBranch VALUES(1000, 1, 'AAA'), (1000, 2, 'BBB');
WITH cte AS(
SELECT ISNULL(b.AccountId, c.AccountId) AccountId, ISNULL(b.BranchId, 0) BranchId, bDescr, cDescr
FROM @tCust c
FULL OUTER JOIN @tBranch b ON b.AccountId = c.AccountId
UNION ALL
SELECT c.AccountId, 0 BranchId, NULL bDescr, cDescr
FROM @tCust c
)
SELECT *
FROM cte
WHERE CONCAT(Bdescr, Cdescr) LIKE '%ABC%'
你需要使用UNION
。
- 选择"客户"字段的第一个查询,其值为
null
Branch
字段 - 第二个查询,选择分支字段,
null
Customers
字段的值。
您需要选择显式所有字段。UNION 的所有查询需求都以相同的顺序和相同的类型提供字段。
select
AccountId,
0 as BranchId,
Customers.Cdescr,
null as Bdescr ,
Customers.C1,
Customers.C2,
null as B1,
null as B2
from
Customers
union all
select
Branch.AccountId,
Branch.BranchId,
null Cdescr,
Branch.Bdescr ,
null as C1,
null as C2,
Branch.B1,
Branch.B2
from
Branch
尝试使用 coalesce
将null
转换为空字符串:
SELECT
*
FROM
Customers C
FULL OUTER JOIN Branch B ON
C.AccountId = B.AccountId
where
CONCAT(
coalesce(C.an_descr1,''),
coalesce(C.an_descr2,''),
coalesce(B.another_descr,'')
) LIKE '%SEARCH_STRING%'