2016-02-16 26 views
2

我有以下的数据库,不要检索,我的问题是,我想查询所有list_id在其对应的list_risk_codemy_list表是'600'及其info_risk_code'400'如果提供的类别的所有或一个现有

table: my_info_list 
info_id  list_id 
1    1 
2    1 
3    1 
4    2 
5    2 
6    3 
7    3 

table: my_info 
info_id  info_risk_code 
1    '400' 
2    '600' 
3    '400' 
4    '600' 
5    '600' 
6    '400' 
7    '400' 


table: my_list 
list_id  list_risk_code 
1    '600' 
2    '600' 
3    '600' 

我的期望低于输出,因为,list_id 1具有3 info_risk_code(400600和400),但它们中的一个是600,从而它不会被包括在内。该list_id 2具有2 info_risk_code(600600),但两者都是600因此它也被忽略。只有list_id 3是检索,因为它有2 info_risk_code这两者都是400:

my_list.list_id  info_risk_code  list_risk_code 
3      '600'    '400' 

现在我的代码如下它得到1和3它们都含有非600 info_risk_code。这是不正确的:

SELECT DISTINCT 
    ml.list_id 
    ,info_risk_code as c_rr 
    ,list_risk_code as a_rr 
FROM 
    my_list AS ml 
    INNER JOIN my_info_list AS mil ON mil.list_id = ml.list_id 
    INNER JOIN my_info AS mi ON mil.info_id = mi.info_id 
WHERE 
    (
      (info_risk_code = '600' OR info_risk_code = '360') 
     AND (NOT list_risk_code = '600' AND NOT list_risk_code = '360') 
    ) 
    OR 
    (
      (NOT info_risk_code = '600' AND NOT info_risk_code = '360') 
     AND (list_risk_code = '600' OR list_risk_code = '360') 
    ) 

您试用/引用您可以使用此:

CREATE TABLE my_info_list(
    info_id INT, 
    list_id INT 
); 

CREATE TABLE my_info(
    info_id INT, 
    info_risk_code varchar(5) 
); 

CREATE TABLE my_list(
    list_id INT, 
    list_risk_code varchar(5) 
); 


INSERT INTO my_info_list VALUES (1,1); 
INSERT INTO my_info_list VALUES (2,1); 
INSERT INTO my_info_list VALUES (3,1); 
INSERT INTO my_info_list VALUES (4,2); 
INSERT INTO my_info_list VALUES (5,2); 
INSERT INTO my_info_list VALUES (6,3); 
INSERT INTO my_info_list VALUES (7,3); 

INSERT INTO my_info VALUES (1,'400'); 
INSERT INTO my_info VALUES (2,'600'); 
INSERT INTO my_info VALUES (3,'400'); 
INSERT INTO my_info VALUES (4,'600'); 
INSERT INTO my_info VALUES (5,'600'); 
INSERT INTO my_info VALUES (6,'400'); 
INSERT INTO my_info VALUES (7,'400'); 

INSERT INTO my_list VALUES (1,'600'); 
INSERT INTO my_list VALUES (2,'600'); 
INSERT INTO my_list VALUES (3,'600'); 

与此查询的编码,现在将近一个小时,需要一些想法。谢谢

+1

我认为有在第一表中提供的样品数据中的错误:字段'list_id'和'info_id'应被切换。 –

+0

@GiorgosBetsos是的,对不起:)你有良好的用眼 – Ceeee

回答

1

您可以使用NOT EXISTS

SELECT DISTINCT ml.list_id, info_risk_code as c_rr, list_risk_code as a_rr 
FROM my_list AS ml 
INNER JOIN my_info_list AS mil 
    ON mil.list_id = ml.list_id 
INNER JOIN my_info AS mi 
    ON mil.info_id = mi.info_id 
WHERE mi.info_risk_code = '400' AND 
     NOT EXISTS (SELECT 1 
        FROM my_info_list AS mil2 
        INNER JOIN my_info AS mi2 ON mil2.info_id = mi2.info_id 
        WHERE mil2.list_id = ml.list_id AND mi2.info_risk_code <> '400') 

Demo here

0

您可以使用group by查询,只选择list_id值,其中所有info_risk_codes 400和相关list_risk_code是600

select ml.list_id 
from my_list ml 
join my_info_list mil on ml.list_id = mil.list_id 
join my_info mi on mil.info_id = mi.info_id 
where ml.list_risk_code = '600' 
group by ml.list_id 
having sum(info_risk_code <> '400') = 0 

http://sqlfiddle.com/#!9/4b9e9/1

相关问题