SQL Server:如何计算一个字段中的值与另一个字段不同,同一个标识符的多个值?

时间:2018-01-24 07:22:24

标签: sql sql-server

我有两个表有一个公共列,一个标识值可以重复(对同一文档的几个观察)。

一个例子:

表A

A_identifier | Value
-------------+-------
1            | A
1            | B

表B

B_identifier | A_identifier | Value
-------------+--------------+-------
1            | 1            | A
2            | 1            | B
3            | 1            | B
4            | 1            | C

上面的例子说明了我在我的数据中寻找的情况类型 - 我们在TableA中有一个具有多个值的案例,其中一些在TableB中是相同的,有些则不是。因此TableA.ValueTableB.Value代表相同的概念。

我想知道每个TableA.A_identifierTableB的行数与TableA.Value的值不同。如果每个A_identifier只有一个观察点,则可以使用not来解决,但多个可能的值会阻止此情况。

我想做的事情是这样的(不起作用):

select distinct 
    b.B_identifier, a.A_identifier 
from 
    TableB b
join 
    TableA a in b.A_identifer = a.A_identifier and b.Value != a.Value

虽然查询在技术上有效,但它返回错误的结果 - 它会计算给定行中TableATableB中的值不同的所有情况。不过,我希望它只计算TableB中每个TableA A_identifier中根本不存在的值。

我尝试将!=替换为not in,这是我为静态参数所做的。

。不支持此语法

我希望我的问题有道理,有人可以提供帮助。提前谢谢。

3 个答案:

答案 0 :(得分:1)

使用NOT EXISTS

select t1.A_identifier, count(t2.value)
from TableA t1
left join TableB t2 on t1.A_identifier = t2.A_identifier and
                  NOT EXISTS (
                          select 1 
                          from TableA t3 
                          where t3.A_identifier = t2.A_identifier and 
                                t3.Value = t2.Value
                 )
group by t1.A_identifier 

答案 1 :(得分:1)

尝试此查询,如果它适合您,

Value

但是,如果您想获得每个SELECT b.A_identifier, b.Value, TOTAL_COUNT = COUNT(b.A_identifier) FROM TableB b LEFT JOIN TableA a ON b.A_identifier = a.A_identifier AND b.Value = a.Value WHERE a.A_identifier IS NULL AND EXISTS (SELECT 1 FROM TableA c WHERE b.A_identifier = c.A_identifier) GROUP BY b.A_identifier, b.Value

的计数
private void searchUserByEmail(final String searchText) {  
        DatabaseReference mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
        Query query = mFirebaseDatabaseReference.child(Constants.FB_TABLE_USERS).orderByChild(Constants.FB_EMAIL).equalTo(searchText);
        query.addListenerForSingleValueEvent(new ValueEventListener() {
}}

答案 2 :(得分:0)

以下SQL怎么样?

select distinct TableA.A_identifier, 
  (select count(*) from TableB 
   where TableB.A_identifier = TableA.A_identifier
   and not exists( 
        select * from TableA where A_identifier = TableB.A_identifier
        and Value = TableB.Value) 
  ) 
    as TableB_Rows
from TableA