一对多关系的多个联接

时间:2017-07-07 18:40:05

标签: sql join filemaker

我有一个FMP数据库,我想用SQL查询。 我正在尝试一次查询3个或更多表。

表结构如下:

##########      ###############
#  USER  # -->  #   PROJECTS  #
##########      ###############

     |          ###########
     ---->      # SAMPLES #
     |          ###########
     |
     |          #####################
     ---->      # PROCESSED_SAMPLES #
                #####################

它们都是由user_id链接的。

USER包含很多字段,但在这种情况下重要的是:

  • 进度
  • 状态

每个用户可以在多个PROJECTS下,并且可以有多个SAMPLES和PROCESSED SAMPLES。每个样本都有一个DATE和VISIT_STATUS。每个处理过的样本都有字段DATE,ORIGIN和LEVEL

我一直在想的问题是(在非实际的SQL中):

> SELECT STATUS, count(num of USERS) FROM (tables) WHERE project = X AND LEVEL >= 1 GROUP BY STATUS

> SELECT STATUS, count(num of USERS) FROM (tables) WHERE project = X AND LEVEL >= 1 AND ORIGIN = Y

> SELECT STATUS, count(num of USERS) FROM (tables) WHERE project = X AND LEVEL >= 1 AND ORIGIN = Y AND (processed sample.DATE = sample.DATE AND sample.VISIT_STATUS = Z)

我正在尝试查找在特定项目下工作的每个不同状态的USERS数量,这些USERS具有来自特定来源的处理样本,其级别为> =

查询通过两个表,如下面的查询工作。但是我用两个以上的表做任何类型的JOIN都没有成功。

SELECT STATUS, count(STATUS) as c
FROM 
     USER A
     JOIN
     PROJECTS B
     on A.user_id = B.user_id
WHERE B.project = X
GROUP BY STATUS
ORDER BY c DESC

我没有成功这样的事情:

SELECT STATUS, count(STATUS) as c
FROM 
     USER A
     JOIN
     PROJECTS B
     on A.user_id = B.user_id
     JOIN
     PROCESSED SAMPLES C
     on B.user_id  = C.user_id
WHERE B.project = X C.LEVEL >= 1
GROUP BY STATUS
ORDER BY c DESC

我不完全确定这个表结构是否允许我像这样进行连接。我尝试过的另一种方式是:

SELECT STATUS, count(STATUS) as c
FROM
     USER A
     JOIN
     PROJECTS B
     on A.user_id = B.user_id
     JOIN
        ( SELECT user_id, sum(CASE WHEN LEVEL >= 1 THEN 1 ELSE 0) as s
          FROM PROCESSED_SAMPLES
          GROUP BY user_id ) AS C
     on B.user_id = C.user_id
WHERE B.project = X AND C.s > 0
GROUP BY STATUS
ORDER BY c DESC

这似乎也没有用。因为我正在通过FMP,如果我的查询中有错误,我会觉得这个超级有用'?'回。虽然我不想大幅改变表格结构,但我完全可以在表格中添加更多字段。

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为,您的上一个查询无效 - FileMaker对子查询的支持有限。第二个查询应该有效。

您的WHERE参数之间缺少AND。

  

GROUP BY STATUS

检查此列是否存在于多个表中。如果是这种情况,请添加表格说明符。

  

ORDER BY c DESC

     

加入处理样本C

您有两个不同的东西分配给同一个别名 - " c"。我怀疑第二个赋值会覆盖第一个赋值,因此ORDER BY会尝试按表对象而不是列进行排序。