如何做一个声明关系的选择声明?

时间:2017-10-03 23:45:13

标签: php sql oracle

外部主题小组

x.get_shape()[0]

内部学科组

| pk | group_id | subid |
|----|----------|-------|
| 1  | 1        | s1    |
| 2  | 1        | s2    |
| 3  | 1        | s3    |
| 4  | 2        | x1    |
| 5  | 2        | x2    |
| 6  | 3        | y1    |
| 7  | 3        | y2    |
| 8  | 3        | y3    |

我目前正在使用php和sql(oracle)。例如, 我有一系列外部主题:

| pk | group_id | subid |
|----|----------|-------|
| 1  | 1        | a1    |
| 2  | 1        | a2    |
| 3  | 1        | a3    |
| 4  | 2        | b1    |
| 5  | 3        | c1    |
| 5  | 3        | c2    |
| 7  | 3        | c3    |
| 8  | 3        | b4    |

我有一系列内部主题

[s1, s2, s3]

我的尝试是(错误的)

[a1, a2, a3]

基本上,我尝试将此sql查询包装到php函数中。如果查询返回关系id。我知道SELECT group_id FROM external_subject_group e_s_g, internal_subject_group i_s_g WHERE e_s_g.group_id = i_s_g.group_id AND e_s_g.subid = "s1" AND e_s_g.subid = "s2" AND e_s_g.subid = "s3" AND i_s_g.subid = "a1" AND i_s_g.subid = "b1" AND i_s_g.subid = "c1" The group id either exist or empty. 存在关系。

例如,另一种关系是[s1, s2, s3] x [a1, a2, a3]

1 个答案:

答案 0 :(得分:0)

我怀疑你想要的不仅仅是一个简单的where条件,而且你正在寻找一种识别具有全部3个值的组的方法。以下是一些替代查询。第一个是我最好的猜测,第二个是用于比较,你可以在SQL Fiddle

试用这些例子

Oracle 11g R2架构设置

CREATE TABLE Table1
    (PK int, GROUP_ID int, SUBID varchar2(20))
;

INSERT ALL 
    INTO Table1 (PK, GROUP_ID, SUBID)
         VALUES (1, 1, 's1')
    INTO Table1 (PK, GROUP_ID, SUBID)
         VALUES (2, 1, 's2')
    INTO Table1 (PK, GROUP_ID, SUBID)
         VALUES (3, 1, 's3')
    INTO Table1 (PK, GROUP_ID, SUBID)
         VALUES (4, 2, 'x1')
    INTO Table1 (PK, GROUP_ID, SUBID)
         VALUES (5, 2, 'x2')
    INTO Table1 (PK, GROUP_ID, SUBID)
         VALUES (6, 3, 'y1')
    INTO Table1 (PK, GROUP_ID, SUBID)
         VALUES (7, 3, 'y2')
    INTO Table1 (PK, GROUP_ID, SUBID)
         VALUES (8, 3, 'y3')
SELECT * FROM dual
;

以下查询使用GROUP BY和HAVING SUM(...)作为一个constct,要求必须使用ALL 3想要的subid。

查询1

select group_id
from Table1
group by group_id
having SUM(case when subid in('s1','s2','s3') then 1 else 0 end) = 3

<强> Result

| GROUP_ID |
|----------|
|        1 |

查询2

此查询仅要求使用列出的任何一个子组件。

select distinct group_id
from Table1
where subid in('s1','s2','s3')

<强> Result

| GROUP_ID |
|----------|
|        1 |

+ EDIT 您可能还需要使用UNION ALL

select group_id
from (
  select pk,group_id,subid from external_subject_group e_s_g
  UNION ALL
  select pk,group_id,subid from internal_subject_group i_s_g
  ) t1
group by group_id
having SUM(case when subid in('s1','s2','s3','a1','a2','a3') then 1 else 0 end) = 6