这个很难解释,当我看到解决方案时,我确信我会面对,但我无法做到正确......
我有三张桌子:
表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?
答案 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