在sql中如何从同一个表中的多个行返回单行数据

时间:2013-05-12 08:35:36

标签: sql ms-access self-join

我有一个活动表,一些标有'评估'(type_id为50)和一些'辅导'(type_id为9),其中包含活动日期。我需要比较这些日期,以确定人们在评估后等待咨询的时间。该表包含许多人的行,这是'id'的主键。我的问题是如何使用评估详细信息和同一个人的咨询详细信息生成结果行,以便我可以比较日期。我已经尝试将表连接到自身,并尝试嵌套子查询,我只是无法理解它。我正在使用Access 2010 btw。 请原谅我的愚蠢,但这里有一个加入表格的例子,它不起作用,什么都不产生(不奇怪):

表格如下:

ID    TYPE_ID   ACTIVITY_DATE_TIME
----------------------------------
1        9      20130411  
1     v 50 v    20130511  
2        9      20130511  
3        9      20130511 

在上面的最后两行只进行了评估,所以我想忽略它们,并且只研究评估和咨询“type-id”的情况

SELECT
  civicrm_activity.id, civicrm_activity.type_id,
  civicrm_activity.activity_date_time,
  civicrm_activity_1.type_id,
  civicrm_activity_1.activity_date_time
FROM
  civicrm_activity INNER JOIN civicrm_activity AS civicrm_activity_1
  ON civicrm_activity.id = civicrm_activity_1.id
WHERE
  civicrm_activity.type_id=9
  AND civicrm_activity_1.type_id=50;

我实际上想知道这是否实际上不可能与SQL有关?我希望有可能吗?感谢您的耐心等待!

2 个答案:

答案 0 :(得分:0)

听起来对你来说,你只想得到你有一个9和50的TYPE_ID条目的身份证号码。

SELECT DISTINCT id FROM civicrm_activity WHERE type_id = '9' AND id IN (SELECT id FROM civicrm_activity WHERE type_id = '50');

这将为您提供一个id列表,其中包含type_id 9和50的条目。使用该列表,您现在可以获取具体信息。

在type_id 9

的时候使用此SQL
SELECT activity_date_time FROM civicrm_activity WHERE id = 'id_from_last_sql' AND type_id = '9'

将此SQL用于type_id 50

的时间
SELECT activity_date_time FROM civicrm_activity WHERE id = 'id_from_last_sql' AND type_id = '50'

答案 1 :(得分:0)

您的查询对我来说也很合适。一个问题可能是您只使用一个表别名。我不知道,但是Access可能会“特别”处理表名,这样实际上WHERE子句会说

WHERE
    civicrm_activity.type_id=9
AND civicrm_activity.type_id=50;

这肯定会解释归零行!

要解决此问题,请为每个表使用别名。我建议更短的,

SELECT  A.id, A.type_id, A.activity_date_time,
              B.type_id, B.activity_date_time
FROM  civicrm_activity as A 
JOIN  civicrm_activity as B
ON    A.id = B.id
WHERE A.type_id=9
AND   B.type_id=50;