根据条件不进行Join表

问题描述 投票:0回答:4

比如说我有两张桌子。

表a

id

1
2
3
4
5

表b

id  type
1   type1
2   type2
3   type3
4   type1
5   type1
1   type1
2   type1
5   type2

我加入我的桌子。

select a.id, b.type from 
table a left join table b on
a.id = b. id

对于 id = 5 我得到:

id    type 
5     type1
5     type2

我只需要 type1 的 id

select a.id, b.type from 
table a left join table b on
a.id = b. id where b.type = 'type1'

对于 id = 5 我得到:

id    type 
5     type1

id =5 也有表 2 中的 type2。

我的问题是我需要排除 id 值,其中 stat 字段中至少有一个 type2 值。

对于 id =5,我期望 空表。因为 id =5 也有 type2

有可能实现这一点吗? 我尝试使用存在,包含,但没有结果

sql oracle left-join
4个回答
1
投票

我们可以使用存在逻辑:

SELECT a.id, b.type
FROM tableA a
LEFT JOIN tableB b
    ON a.id = b.id
WHERE
    b.type = 'type1' AND
    NOT EXISTS (
        SELECT 1
        FROM tableB t
        WHERE t.id = b.id AND
              t.type = 'type2'
    );

1
投票

这将有助于实现所需的输出。

SELECT *
    FROM Table1 t1
    LEFT JOIN Table2 t2 ON t1.id = t2.id
    WHERE NOT EXISTS (
        SELECT 1
        FROM Table1
        WHERE id = t1.id AND type = 'type2'
    );

0
投票

您可以使用第二个外部联接并过滤联接条件中的类型,并检查

type2
联接是否不匹配任何行:

SELECT a.id,
       b1.type
FROM   a 
       LEFT OUTER JOIN b b1
       ON     a.id    = b1.id
          AND b1.type = 'type1'
       LEFT OUTER JOIN b b2
       ON     a.id    = b2.id
          AND b2.type = 'type2'
WHERE  b2.id IS NULL

对于样本数据:

CREATE TABLE a (id) AS
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 5;

CREATE TABLE b(id, type) AS
SELECT 1, 'type1' FROM DUAL UNION ALL
SELECT 1, 'type1' FROM DUAL UNION ALL
SELECT 2, 'type1' FROM DUAL UNION ALL
SELECT 2, 'type2' FROM DUAL UNION ALL
SELECT 3, 'type3' FROM DUAL UNION ALL
SELECT 4, 'type1' FROM DUAL UNION ALL
SELECT 5, 'type1' FROM DUAL UNION ALL
SELECT 5, 'type2' FROM DUAL;

输出:

身份证 类型
1 类型1
1 类型1
4 类型1
3

小提琴


0
投票

由于您使用的是 Oracle,您还可以使用

MINUS
运算符,即

用于返回第一个 SELECT 语句中第二个 SELECT 语句未返回的所有行

应用您的场景需要一个小技巧,即从第二个查询中选择

type1
以使行与第一个查询匹配:

SELECT a.id,
       b1.type
FROM   a
       LEFT OUTER JOIN b b1
                    ON a.id = b1.id
                       AND b1.type = 'type1'
MINUS ALL
SELECT a.id,
       'type1'
FROM   a
       INNER JOIN b b1
               ON a.id = b1.id
                  AND b1.type = 'type2' 

另请注意,我们使用

MINUS ALL
,否则 Oracle 会重复结果,您只会看到其中一条
1,type1
记录。

Fiddle采用自@MTO的回答。

结果:

身份证 类型
1 类型1
1 类型1
4 类型1
3
© www.soinside.com 2019 - 2024. All rights reserved.