如何从第二个表中选择组智能

时间:2016-02-26 17:33:39

标签: sql sql-server

这个很难解释,当我看到解决方案时,我确信我会面对,但我无法做到正确......

我有三张桌子:

表A 包含我想要执行某些操作的新记录。

表B 包含特定类型的表C 中的所有活动(事先完成)。

表C 是一种" master"包含所有活动以及客户ID和许多其他内容的表。

我需要从表B中选择表A中的所有活动。到目前为止一切顺利。 我无法聚在一起的部分是,我还需要表B 中与表A 中包含的活动具有相同客户ID的所有活动。

这就是我之后的事情:

activity
2
3
4
5
6

这里的技巧是获取活动2,因为活动2也由 customer 2完成,即使它不在表A中。

以下是表格:

表A (新记录)

activity
3
4
5
6

表B (表C中特定类型的所有记录)

activity
1
2   <-- How do I get this record as well?
3
4
5
6

表C (所有记录)

activity    customer
1           1
2           2
3           2
4           3
5           3
6           4
7           5

我尝试过这样的事情......

SELECT * 
FROM    table_b b
INNER JOIN table_c c
    ON  c.activity = b.activity
INNER JOIN table_a a
    ON  a.activity = b.activity

......但当然只会产生:

activity
3
4
5
6

我怎样才能在这里获得活动2?

3 个答案:

答案 0 :(得分:1)

这是一种方法

SELECT *
FROM   TableB b1
WHERE  EXISTS (SELECT 1
               FROM   Tablec c1
               WHERE  EXISTS (SELECT 1
                              FROM   TableA a
                                     INNER JOIN Tablec c
                                             ON a.activity = c.activity
                              WHERE  c.customer = c1.customer)
                      AND c1.activity = b1.activity) 

答案 1 :(得分:1)

要执行此操作返回一列,我建议将Table_a中Table_b中的活动的customer_id暂存到CTE(公用表表达式MSDN CTE)中,然后在table_c中选择活动并加入CTE以仅获取活动有效的customer_id。

CTE的示例:(注意;关键字之前的分号WITH是SQL 2005中具有多个语句的问题的解决方法。如果您使用的是较新的版本,则不需要或者不运行批处理语句。)

;WITH cte_1 AS (
                SELECT distinct c.customer --(only need a distinct result of customer ids)
                from table_b b 
                join table_a a on b.activity = a.activity --(gets only activities in b that are in a)
                join table_c c on b.activity = c.activity --(gets customer id of activies in table b)
)
SELECT a.activity
FROM table_c a
JOIN cte_1 b ON a.customer = b.customer

或者,您可以使用select distinct在三个连接中执行此操作。但是,无论您决定如何实施解决方案,我都发现CTE是一种更容易开发和思考此问题的方法。尽管随着数据集的增长,三种连接解决方​​案很可能随着时间的推移而扩展并表现更好。

示例:

SELECT distinct d.activity
from table_b b 
join table_a a on b.activity = a.activity --(gets only activities in b that are in a)
join table_c c on b.activity = c.activity --(gets customer id of activies in table b)
join table_c d ON c.customer = d.customer 

两者都会输出:

2
3
4
5
6

答案 2 :(得分:0)

你可以尝试左连接吗?

SELECT * 
FROM    table_b b
INNER JOIN table_c c
    ON  c.activity = b.activity
LEFT JOIN table_a a
    ON  b.activity = a.activity