SQL 服务器主/详细信息搜索查询



我有 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字段
  • 第二个查询,选择分支字段,nullCustomers字段的值。

您需要选择显式所有字段。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

尝试使用 coalescenull转换为空字符串:

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%'

最新更新