【问题标题】:Sql Server Master/Detail search querySql Server Master/Detail 搜索查询
【发布时间】:2017-10-30 18:05:14
【问题描述】:

我有 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

customer表上缺少的branchId列应该默认设置为0。

我需要能够同时搜索 Cdescr 和 Bdescr,并且 Customer 表上的每个匹配项都应该选择相关的分支。如果仅在分支表上进行数学运算,则应选择相关的客户行

在 branchId 上使用 FULL OUTER JOIN 连接实际上不起作用

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

在当前查询中,我无法在分支表中搜索

【问题讨论】:

  • 能否请您提供用于测试完整外连接的查询?您收到错误还是给出错误的结果集?
  • BranchId (0) 来自哪里?
  • 我没有错误...将使用实际查询进行编辑

标签: sql sql-server


【解决方案1】:

试试这个:

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

【讨论】:

  • 如何在这个查询中过滤?例如搜索 cDescr (WHERE cDescr LIKE '%ABC%') 仅返回 1 行
  • 只需将WHERE Cdescr = 'ABC' 放在查询末尾?但是,只有一条 CDescr ABC 记录,所以一行应该是正确的......还是您希望描述在所有记录中重复?
  • 第二个...如果我搜索“ABC”,我希望有 3 行。
  • 好的,那么 UNION ALL 确实应该有所帮助......我相应地修改了答案。
【解决方案2】:

你需要使用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

【讨论】:

  • 你错过了null asB1,中的一个空格,它应该是null as B1,
【解决方案3】:

尝试使用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%'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多