联盟三个或更多有条件的表

时间:2018-06-18 08:25:43

标签: sql postgresql

我需要帮助来解决一些问题。

我有一些表格levelAsignment,其中包含level_idstore_iduser_id列。对于每个user_id,我可以编写一个查询来获取level_idstore_id

我还有一张桌子stores。 我需要为每个商店获得他的等级并计算当前等级和商店的用户。

这很简单,但问题在于存储数据,因为在levelAsignment表中,用户可以为某些操作员级别设置所有商店。

看起来像这样:

    level_id  |  store_Id |  user_id
       4            1           5
       1            5           5
       6            1

store_id = 1表中的stores表示所有商店,所以我需要显示除1之外的所有商店。

select * from stores where id != 1;

所以我需要一个如何组织的建议。

我找到了解决问题的不同方法,但是有很多工会和条件。

2 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了这个问题。但它可能有用:

select la.level_id, la.store_Id, count(la.user_id) from stores s
left join levelAsignment la on (s.id = la.store_id and la.store_id != 1) or (la.store_id = 1 and s.id != 1)
group by (level_id, store_Id)

答案 1 :(得分:0)

这取决于您如何加入商店表

我认为你应该将stores_assignment(其中store_id = 1)加入stores表中的所有数据,但是子查询将外部查询从级别赋值表中排除store_id = 1列。您可能必须在临时表中为存储数据创建连接列。然后联合level_assignment表,其中store_id!= 1

示例:

WITH get_all_stores_for_store_id_1 AS (

SELECT 
a.level_assigment,
a.store_id,
b.store_id,
a.user_id
FROM level_assignment a 
LEFT JOIN stores b ON a.join_column = b.join_column
WHERE a.store_id = 1)

SELECT
level_assignment,
b.store_id AS store_id,
user_id
FROM get_all_stores_for_store_id_1 

UNION

SELECT
level_assignment,
store_id,
user_id
FROM level_assignment
WHERE store_id != 1

这有意义吗?

考虑如何加入数据,我们可以这样做:

获取stores表并创建一个1列,每行包含一个商店,以便我们可以使用store_id = 1将所有商店加入level_assignment表:

WITH set_1_column_in_stores_table AS (

SELECT 
1 AS join_id,
store_id,
FROM stores),

all_store_rows_get_all_stores AS (
SELECT 
a.level_assigment,
a.store_id,
b.store_id,
a.user_id
FROM level_assignment a 
LEFT JOIN set_1_column_in_stores_table b ON a.store_id= b.join_id
-- The above will join all stores where store_id = 1 in level_assigment
WHERE a.store_id = 1)

SELECT
level_assignment,
b.store_id AS store_id,
user_id
FROM all_store_rows_get_all_stores 

UNION 

SELECT
level_assignment,
store_id,
user_id
FROM level_assignment
WHERE store_id != 1