【问题标题】:combine and remove value from database合并并从数据库中删除值
【发布时间】:2014-02-25 14:48:01
【问题描述】:

我有 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

【问题讨论】:

  • %d %@ 是否来自 Objective-C,因此 iOS 的重要性?它们是什么意思?每个值或某些值序列相同的值?
  • 好的,我想我明白了。这就像一个 printf 格式。
  • @albe:你能给出答案吗?
  • 我需要一些东西:你使用的是什么数据库引擎(PostgreSQL)?正如@Ziouas 指出的那样,这似乎是一个分层的事情,这很重要。还有你传递的参数和相关数据的小样本。
  • 我无法发布我的图片..

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


【解决方案1】:

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

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

如果是 ORACLE 那就看看 CONNECT BY PRIOR,

如果是 MS SQL,那么这里是等效的:Simulation of CONNECT BY PRIOR of ORACLE in SQL SERVER

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

【讨论】:

  • 这是针对objective-c的。上面的查询是针对 iOS 开发的。我从服务器获取所有数据并存储在本地数据库中。然后我正在为父子编写查询。但我遇到了问题。
  • 用表格检查我编辑的代码。我回答了孩子的问题。它保存到 Assessment_Master 表中。如果我过滤查询,它不会得到父子。我需要显示所有问题。 QM_ID 432,433,434。因为这些都是亲子关系
  • Objective-c 可以,但是哪个数据库引擎?你试过递归查询吗?
  • 客户端使用 SOAP webservie 获取服务器数据。我正在使用 TBXML 解析器库进行获取
【解决方案2】:

我假设如下:

  • 您使用的是 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 中添加您需要的任何内容。如果你有更深的层次结构,这在不同的平台上又是不同的。如果你想让它们在不同的行上,那很简单。

【讨论】:

  • 如果我运行您的查询,它将得到所有问题。我不想要这个。如果我回答 433 问题。我只需要得到 parent_id 432 孩子。我不想显示所有其他内容。
  • 如果我回答了孩子的问题 433 并且我得到了只有 433 个孩子的父母。我没有收到 434 问题。检查编辑的代码和最终的组合表。
猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 2018-02-03
  • 2018-06-09
相关资源
最近更新 更多