2017-09-13 53 views
0

我有这样的事情:搜索子行的值

Transaction Customer 
1    Cust1 
2    Cust2 
3    Cust3 
4    Cust4 

TransID  Code 
2   A 
2   B 
2   D 
3   A 
4   B 
4   C 

如果我希望能够做一些像“如果客户‘Cust1’有代码‘A’”,我应该怎么最好的建立视图?我想最终能够查询像“从某些代码列表中查看代码的地方选择客户”或“从[某些代码列表]中选择代码的视图中选择Cust1”

虽然我可以做像

Customer  | Codes 
Cust1   | A, B, D 
Etc. 

SELECT Transaction from Tbl where Codes like 'A' 

这对我来说似乎是不切实际的做法。

+1

请分享您的预期结果 – TheGameiswar

+0

@TheGameiswar这就是问题所在,我不确定我应该拥有什么。我可以做一些像'TransID |代码1 |代码2 |代码3 ...'但这似乎不切实际。 –

+1

那么如果你不知道预期的结果应该是什么,那么我们怎么能对它进行编码呢?你试图在这里找到/回答的真正问题是什么? – scsimon

回答

1

以下是我会做它

;with xact_cust (xact, cust) as 
(
    select 1, 'cust1' union all 
    select 2, 'cust2' union all 
    select 3, 'cust3' union all 
    select 4, 'cust4' 
), xact_code (xact, code) as 
(
    select 2, 'A' union all 
    select 2, 'B' union all 
    select 2, 'D' union all 
    select 3, 'A' union all 
    select 4, 'B' union all 
    select 4, 'C' 
) 
select Cust, Code 
from xact_cust cust 
inner join xact_code code 
    on cust.xact = code.xact 
where exists (select 1 
       from xact_code i 
       where i.xact = code.xact 
        and i.code = 'A') 

如果您需要序列化到一个分隔的列表代码,看看这篇文章:What this query does to create comma delimited list SQL Server?

+0

好的,这是有道理的,这正是我没有正确要求的,我只是添加一个'cust'组来为每一行添加我想要的代码。 –

1

这里的另一种选择......

IF OBJECT_ID('tempdb..#CustomerTransaction', 'U') IS NOT NULL 
DROP TABLE #CustomerTransaction; 

CREATE TABLE #CustomerTransaction (
    TransactionID INT NOT NULL PRIMARY KEY, 
    Customer CHAR(5) NOT NULL 
    ); 
INSERT #CustomerTransaction (TransactionID, Customer) VALUES 
    (1, 'Cust1'), (2, 'Cust2'), (3, 'Cust3'), 
    (4, 'Cust4'), (5, 'Cust5'); 

IF OBJECT_ID('tempdb..#TransactionCode', 'U') IS NOT NULL 
DROP TABLE #TransactionCode; 

CREATE TABLE #TransactionCode (
    TransactionID INT NOT NULL, 
    Code CHAR(1) NOT NULL 
    ); 
INSERT #TransactionCode (TransactionID, Code) VALUES 
    (2, 'A'), (2, 'B'), (2, 'D'), (3, 'A'), (4, 'B'), (4, 'C'); 

--SELECT * FROM #CustomerTransaction ct; 
--SELECT * FROM #TransactionCode tc; 
--============================================================= 

SELECT 
    ct.TransactionID, 
    ct.Customer, 
    CodeList = STUFF(tcx.CodeList, 1, 1, '') 
FROM 
    #CustomerTransaction ct 
    CROSS APPLY (
       SELECT 
        ', ' + tc.Code 
       FROM 
        #TransactionCode tc 
       WHERE 
        ct.TransactionID = tc.TransactionID 
       ORDER BY 
        tc.Code ASC 
       FOR XML PATH('') 
       ) tcx (CodeList); 

结果...

TransactionID Customer CodeList 
------------- -------- ----------- 
1    Cust1 NULL 
2    Cust2  A, B, D 
3    Cust3  A 
4    Cust4  B, C 
5    Cust5 NULL 
+0

我需要使用类似的运算符来进一步查询这些结果吗? –

+1

@PatrickSchomburg - No.您希望通过向外部查询添加WHERE子句来过滤事务或客户...或添加到子查询中现有的WHERE中以过滤代码。 –