我正在运行Oracle 11g,但这是一个更普遍的SQL问题。
所以我有以下表格/数据 -
CREATE TABLE TEST_GROUP (
ID VARCHAR2(20),
CONSTRAINT test_group_pk PRIMARY KEY (ID)
);
INSERT INTO TEST_GROUP VALUES ('AAA');
CREATE TABLE GROUP_PREFERENCE (
GROUP_ID VARCHAR2(20),
ID VARCHAR2(20),
TYPE VARCHAR2(20),
CONSTRAINT GROUP_PREF_PK PRIMARY KEY (GROUP_ID, ID, TYPE)
);
INSERT INTO GROUP_PREFERENCE VALUES ('AAA', 'AAA-P1', 'CONFIGURABLE');
INSERT INTO GROUP_PREFERENCE VALUES ('AAA', 'AAA-P2', 'ENABLED');
CREATE TABLE PREFERENCE_ENTRY (
PREFERENCE_ID VARCHAR2(20),
PREFERENCE_VALUE VARCHAR2(20),
CONSTRAINT PREF_PK PRIMARY KEY (PREFERENCE_ID, PREFERENCE_VALUE)
);
INSERT INTO PREFERENCE_ENTRY VALUES ('AAA-P1', 'TRUE');
INSERT INTO PREFERENCE_ENTRY VALUES ('AAA-P2', 'TRUE');
我的SQL -
SELECT g.ID
FROM TEST_GROUP g
JOIN GROUP_PREFERENCE gp ON g.ID = gp.GROUP_ID
JOIN PREFERENCE_ENTRY pe ON gp.ID = pe.PREFERENCE_ID
WHERE (
(gp.TYPE = 'CONFIGURABLE' AND pe.PREFERENCE_VALUE = 'TRUE')
AND
(gp.TYPE = 'ENABLED' AND pe.PREFERENCE_VALUE = 'TRUE')
)
我希望SQL返回TEST_GROUP'AAA',但它看起来像是因为我正在测试它没有的两个PREFERENCE_ENTRY值。如果我自己测试任何一个它确实返回行但是我需要测试两个PREFERENCE_ENTRY条目都是'TRUE'。
我确信这很简单,但我正在努力...
您的帮助SQL大师将非常感激。
提前致谢。
答案 0 :(得分:2)
在条件使用或不使用AND
的情况下(...)
WHERE (
(gp.TYPE = 'CONFIGURABLE' AND pe.PREFERENCE_VALUE = 'TRUE')
OR
(gp.TYPE = 'ENABLED' AND pe.PREFERENCE_VALUE = 'TRUE')
)
编辑:
SELECT g.ID
FROM TEST_GROUP g
JOIN GROUP_PREFERENCE gp1 ON g.ID = gp1.GROUP_ID and gp1.TYPE='CONFIGURABLE'
JOIN GROUP_PREFERENCE gp2 ON g.ID = gp2.GROUP_ID and gp2.TYPE='ENABLED'
JOIN PREFERENCE_ENTRY pe1 ON gp1.ID = pe1.PREFERENCE_ID
JOIN PREFERENCE_ENTRY pe2 ON gp2.ID = pe2.PREFERENCE_ID
WHERE pe1.PREFERENCE_VALUE = 'TRUE' and pe2.PREFERENCE_VALUE = 'TRUE'
答案 1 :(得分:2)
这是另一种看似简单方法的选择。
您注意到您无法加入表,然后使用WHERE
子句检查'CONFIGURABLE'和'ENABLED',因为WHERE
子句引用了一行而一行的类型不能'CONFIGURABLE'和'ENABLED'同时。
您要做的是从主表中选择并使用WHERE
或EXISTS
在IN
子句中查找其他表格(其中IN
更简单两个)。
select id
from test_group
where id in
(
select gp.group_id
from group_preference gp
join preference_entry pe on gp.id = pe.preference_id
where gp.type = 'CONFIGURABLE' and pe.preference_value = 'TRUE'
)
and id in
(
select gp.group_id
from group_preference gp
join preference_entry pe on gp.id = pe.preference_id
where gp.type = 'ENABLED' and pe.preference_value = 'TRUE'
);
如Gordon所示,简单地聚合group_preference
和preference_entry
更容易,并且是首选方法(您可以从查询中删除表TEST_GROUP
- 这是不需要的)。但有时候您需要使用EXISTS
或IN
进行查找,所以我想我只想提一下方法: - )
答案 2 :(得分:1)
您可以使用NonOfferedProducts
和group by
。对于使用having
:
in