合并并从数据库中删除值

时间:2014-02-25 14:48:01

标签: ios sql parent-child inner-join union

我有Question_Master和Assessment_Master表。在question_Master我有亲子关系的问题。当我回答父问题时,当我过滤回答按钮过滤器时,我需要显示父项和子项。当我回答孩子的问题时,当我过滤回答按钮过滤器时,我需要显示父母和孩子。但我的问题是,当我回答这两个问题时,我正在让孩子重复。

当回答父母问题时,它会得到父母:

  SELECT a.QM_ID,a.QM_QCM_ID,
       a.QM_Question,a.QM_Type,
       a.QM_Parent_Id,
       c.AM_Answer, 
       c.AM_Comments 
  FROM question_master a 
       INNER JOIN Assessment_master c 
             ON (c.AM_QM_ID = a.QM_ID 
                 AND c.AM_HNM_ID = %d 
                 AND c.AM_HM_ID = %d 
                 AND c.AM_ASM_Local_Id = %@) 
 WHERE a.QM_Parent_Id = 0 
       AND a.QM_Status = 'A' 
       AND a.QM_QCM_ID = %@ 
       AND a.QM_QRM_Id = %@

UNION
SELECT b.QM_ID,
       b.QM_QCM_ID,
       b.QM_Question,
       b.QM_Type,
       b.QM_Parent_Id,
       null, 
       null 
  FROM question_master b 
       INNER JOIN Assessment_master d 
             ON (d. AM_QM_ID = b.QM_Parent_Id 
                 AND d.AM_HNM_ID = %d 
                 AND d.AM_HM_ID = %d 
                 AND d.AM_ASM_Local_Id = %@) 
 WHERE b.QM_Parent_Id != 0 
       AND b.QM_Status = 'A' 
       AND b.QM_QCM_ID = %@ 
       AND b.QM_QRM_Id = %@

当我回答孩子的问题时,它会得到亲子:

    SELECT a.QM_ID,a.QM_QCM_ID,
       a.QM_Question,a.QM_Type,
       a.QM_Parent_Id,
       c.AM_Answer, 
       c.AM_Comments 
  FROM question_master a 
       INNER JOIN Assessment_master c 
             ON (c.AM_QM_ID = a.QM_ID 
                 AND c.AM_HNM_ID = %d 
                 AND c.AM_HM_ID = %d 
                 AND c.AM_ASM_Local_Id = %@) 
 WHERE a.QM_Parent_Id = 0 
       AND a.QM_Status = 'A' 
       AND a.QM_QCM_ID = %@ 
       AND a.QM_QRM_Id = %@

UNION
SELECT b.QM_ID,
       b.QM_QCM_ID,
       b.QM_Question,
       b.QM_Type,
       b.QM_Parent_Id,
       d.AM_Answer, 
       d.AM_Comments 
  FROM question_master b 
       INNER JOIN Assessment_master d 
             ON (d. AM_QM_ID = b.QM_ID 
                 AND d.AM_HNM_ID = %d 
                 AND d.AM_HM_ID = %d 
                 AND d.AM_ASM_Local_Id = %@) 
 WHERE b.QM_Parent_Id IN (SELECT QM_ID 
                            FROM question_master 
                           WHERE QM_Parent_Id = 0 
                                 AND QM_Status = 'A' 
                                 AND QM_QCM_ID = %@ 
                                 AND QM_QRM_Id = %@)

我使用了上面的组合查询:

 SELECT a.QM_ID,a.QM_QCM_ID,
       a.QM_Question,a.QM_Type,
       a.QM_Parent_Id,
       c.AM_Answer, 
       c.AM_Comments 
  FROM question_master a 
       INNER JOIN Assessment_master c 
             ON (c.AM_QM_ID = a.QM_ID 
                 AND c.AM_HNM_ID = %d 
                 AND c.AM_HM_ID = %d 
                 AND c.AM_ASM_Local_Id = %@) 
 WHERE a.QM_Parent_Id = 0 
       AND a.QM_Status = 'A' 
       AND a.QM_QCM_ID = %@ 
       AND a.QM_QRM_Id = %@

UNION
SELECT b.QM_ID,
       b.QM_QCM_ID,
       b.QM_Question,
       b.QM_Type,
       b.QM_Parent_Id,
       null, 
       null 
  FROM question_master b 
       INNER JOIN Assessment_master d 
             ON (d. AM_QM_ID = b.QM_Parent_Id 
                 AND d.AM_HNM_ID = %d 
                 AND d.AM_HM_ID = %d 
                 AND d.AM_ASM_Local_Id = %@) 
 WHERE b.QM_Parent_Id != 0 
       AND b.QM_Status = 'A' 
       AND b.QM_QCM_ID = %@ 
       AND b.QM_QRM_Id = %@

UNION
SELECT b.QM_ID,
       b.QM_QCM_ID,
       b.QM_Question,
       b.QM_Type,
       b.QM_Parent_Id,
       d.AM_Answer, 
       d.AM_Comments 
  FROM question_master b 
       INNER JOIN Assessment_master d 
             ON (d. AM_QM_ID = b.QM_ID 
                 AND d.AM_HNM_ID = %d 
                 AND d.AM_HM_ID = %d 
                 AND d.AM_ASM_Local_Id = %@) 
 WHERE b.QM_Parent_Id IN (SELECT QM_ID 
                            FROM question_master 
                           WHERE QM_Parent_Id = 0 
                                 AND QM_Status = 'A' 
                                 AND QM_QCM_ID = %@ 
                                 AND QM_QRM_Id = %@)

但在这里,我得到额外的孩子重复值。当我使用LEFT它得到所有的孩子问题,如果我使用EXCEPT然后回答父问题它没有得到父子关系。

Question_Master:

QM_ID    QM_QRM_ID   QM_LCM_ID  QM_QCM_ID   QM_Question       QM_Parent_Id

432         5            19       1         question_parent       0
433         5            19       1         question_child        432
434         5            19       1           question_child1      432

Assessment_Master:

AM_ID     AM_UM_ID   AM_ASM_Local_Id  AM_QM_ID   AM_Answer   AM_Comments  AM_HNM_ID
1          8            1                433       NULL        testing      1

如果我回答孩子问题433,我只得到433孩子的父母。我没有得到434个问题。

a.QM_ID  a.QM_QCM_ID  a.QM_Question     a.QM_Parent_Id c.AM_Answer  c.AM_Comments
         432       1          question_parent     0                Null        NULL
          433      1          question_child       432             null        value

2 个答案:

答案 0 :(得分:0)

您使用的是哪个数据库引擎?

您是否尝试过重复以创建简单的父子关系?

如果是ORACLE,那么请看看CONNECT BY PRIOR,

如果此处的MS SQL是等效的:Simulation of CONNECT BY PRIOR of ORACLE in SQL SERVER

您不必使用任何联合,结果将更容易过滤和使用。

答案 1 :(得分:0)

我假设以下内容:

  • 您正在使用SQLite或MySQL
  • 有问题的最后一行master有qm_id 434而不是433(否则我看不到主键)
  • 您想要在一行中显示所有内容,而孩子没有自己的孩子

然后这给出了你在评论中要求的内容(QM_ID 432,433,434):

SELECT a.QM_ID,GROUP_CONCAT(b.QM_ID) 
FROM question_master a JOIN 
     question_master b ON a.QM_ID = b.QM_PARENT_ID
GROUP BY a.QM_ID;

从assessment_master添加您需要的任何内容。如果您有更深层次结构,那么在不同平台上这又是不同的。如果你想要它们在不同的行上,那很简单。

相关问题