SQL JOIN没有返回想要的结果

时间:2017-12-15 12:01:41

标签: sql oracle

我正在运行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大师将非常感激。

提前致谢。

3 个答案:

答案 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'同时。

您要做的是从主表中选择并使用WHEREEXISTSIN子句中查找其他表格(其中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_preferencepreference_entry更容易,并且是首选方法(您可以从查询中删除表TEST_GROUP - 这是不需要的)。但有时候您需要使用EXISTSIN进行查找,所以我想我只想提一下方法: - )

答案 2 :(得分:1)

您可以使用NonOfferedProductsgroup by。对于使用having

的操作,Oracle也有一个很好的简写
in