2016-11-30 90 views
0

我有两个表让我们说 “表1” 和 “表2”如何使用 '不在' 和 'IN' 在同一时间在查询

表1

ID   AccountId BranchId otherColumn 
----------- ---------- ---------- ----------- 
1   15   58   data 
2   22   62   data 
3   31   89   data 
4   49   45   data 
.   .   .   . 
.   .   .   . 
.   .   .   . 
.   .   .   . 
.   .   .   . 

表2

ID   fromAccount toAccount ExcludeAccount IncludeAccount FromBranch ToBranch  IncludeBranch ExcludeBranch 
----------- ---------- ---------- -----------  ----------  --------- ------------ -------------- ------------ 
1   1   90   89,34,3  101    30   100   205,207,250  35,40 
1   5   67       90    22   50   70,90   20 
2   7   4   3        5   200       
2   1   5           7   10   16    9 
3   5   89   6,7   200    55   243   34    35,200,201,234 

现在我想选择所有数据从表1使用表达式从表1

我有功能的逗号分隔的文本转换成表格

select data from dbo.split('23,45,2', ',') 

这将返回

data 
------ 
23 
45 
2 

我所需的输出为第1行是

ID   AccountId BranchId otherColumn 
    ----------- ---------- ---------- ----------- 
    .   1   .   data 
    .   2   .   data 
    .   4   .   data 
    .   5   .   data 
    .   6   .   data 
    .   7   .   data 
    .   8   .   data 
    .   .   .    . 
    .   .   .    . 
    .   33   .    . 
    .   35   .    . 
    .   .   .    . 
    .   88   .    . 
    .   90   .    . 
    .   101   .    . 
    .   .   30   . 
    .   .   31   . 
    .   .   .   . 
    .   .   34   . 
    .   .   36   . 
    .   .   .   . 

我已创建查询以获取与这两个表格的关系的数据Ë但它始终没有返回行

这里是我的查询

select * from Table1 
inner join Table2 on Table1.AccountId between Table2.fromAccount and Table2.toAccount 
and Table1.AccountId not in (select data from dbo.split(Table2.ExcludeAccount, ',')) 
and Table1.AccountId in (select data from dbo.split(Table2.IncludeAccount, ',')) 
and Table1.BranchId between Table2.FromBranch and Table2.ToBranch 
and Table1.BranchId not in (select data from dbo.split(Table2.ExcludeAccount, ',')) 
and Table1.BranchId in (select data from dbo.split(Table2.IncludeAccount, ',')) 

我的问题是,为什么总是没有返回数据是什么东西错在我的查询或我在错误的方式

+0

@Ken White我被选为MySQL,因为Stack Overflow建议我选择MySQL – Dexter

+0

不。StackOverflow建议您添加**相关的DBMS **标记(*,如MySQL或SQL Server *),只添加SQL。它没有**建议你随机获取不适用于你的问题的标签。再次,仅使用**实际应用于您的问题的标签 - 它在处理SQL问题时会产生很大的差异。 –

+1

当您决定将csv存储在列中时,您走进了这个列表。 http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-that-bad/3653574 – e4c5

回答

1

not in通常不是你想要的子查询。如果子查询返回的任何值为NULL,则根本没有任何通过该过滤器。相反,习惯使用not exists

例如,而不是:

not in (select data from dbo.split(Table2.ExcludeAccount, ',')) 

用途:

not exists (select 1 
      from dbo.split(Table2.ExcludeAccount, ',') s(p) 
      where Table1.BranchId = s.p 
      ) 

您还可能有数据类型的问题,但SQL Server应该将它们正确地转换。

+0

“如果子查询返回的任何值为NULL ...” - 相反,习惯于避免空值。 – onedaywhen