我有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
答案 0 :(得分:0)
您使用的是哪个数据库引擎?
您是否尝试过重复以创建简单的父子关系?
如果是ORACLE,那么请看看CONNECT BY PRIOR,
如果此处的MS SQL是等效的:Simulation of CONNECT BY PRIOR of ORACLE in SQL SERVER。
您不必使用任何联合,结果将更容易过滤和使用。
答案 1 :(得分:0)
我假设以下内容:
然后这给出了你在评论中要求的内容(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添加您需要的任何内容。如果您有更深层次结构,那么在不同平台上这又是不同的。如果你想要它们在不同的行上,那很简单。