sql - 如何仅从表中选择具有不存在于 PostgreSQL 内部联接中的 ID 的行?

标签 sql postgresql inner-join

我有下表

postgres=# select * from joins_example;
 user_id | price  | id |          email           
---------+--------+----+--------------------------
       1 | $30.00 |    | 
       5 | $50.00 |    | 
       7 | $20.00 |    | 
         |        |  1 | hadil@example.com
         |        |  5 | saiid@example.com
         |        |  2 | fahir@example.com
       6 | $60.00 |  6 | oma@example.com
       8 | $40.00 |  8 | nasim@example.com
         |        |  8 | nasim.hassan@example.com
       9 | $40.00 |  9 | farah@example.com
       9 | $70.00 |    | 
      10 | $80.00 |    | majid@example.com
         |        | 10 | majid.seif@example.com
(13 rows)

user_idid 之间的自内连接产生

postgres=# select * from joins_example as x inner join joins_example as y on x.user_id = y.id;
 user_id | price  | id |       email       | user_id | price  | id |          email           
---------+--------+----+-------------------+---------+--------+----+--------------------------
       1 | $30.00 |    |                   |         |        |  1 | hadil@example.com
       5 | $50.00 |    |                   |         |        |  5 | saiid@example.com
       6 | $60.00 |  6 | oma@example.com   |       6 | $60.00 |  6 | oma@example.com
       8 | $40.00 |  8 | nasim@example.com |         |        |  8 | nasim.hassan@example.com
       8 | $40.00 |  8 | nasim@example.com |       8 | $40.00 |  8 | nasim@example.com
       9 | $40.00 |  9 | farah@example.com |       9 | $40.00 |  9 | farah@example.com
       9 | $70.00 |    |                   |       9 | $40.00 |  9 | farah@example.com
      10 | $80.00 |    | majid@example.com |         |        | 10 | majid.seif@example.com
(8 rows)

我想要的是:

 user_id | price  | id |       email       | user_id | price  | id |          email           
---------+--------+----+-------------------+---------+--------+----+--------------------------
       7 | $50.00 |    |                   |         |        |    |
         |        |    |                   |         |        |  2 | fahir@example.com

或:

 user_id | price  | id |       email       | user_id | price  | id |          email           
---------+--------+----+-------------------+---------+--------+----+--------------------------
         |        |    |                   |       7 | $50.00 |    |
         |        |  2 | fahir@example.com |         |        |    |

甚至

 user_id | price  | id |          email           
---------+--------+----+--------------------------
       5 | $50.00 |    | 
         |        |  2 | fahir@example.com

将是一个好的开始。

具体来说,我想知道如何仅从 joins_example 中选择具有 user_idid 的行内连接。

最佳答案

您可以考虑使用具有NOT EXISTS 条件的相关子查询的方法:

select * 
from joins_example as x 
where 
    ( 
        x.user_id is not null 
        and not exists (
            select 1 from joins_example y where  x.user_id = y.id
        )
    )
    or ( 
        x.id is not null 
        and not exists (
            select 1 from joins_example y where  x.id = y.user_id
        )
    )

Demo on DB Fiddle :

| user_id | price | id  | email             |
| ------- | ----- | --- | ----------------- |
| 7       | 20.00 |     |                   |
|         |       | 2   | fahir@example.com |

关于sql - 如何仅从表中选择具有不存在于 PostgreSQL 内部联接中的 ID 的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58151218/

相关文章:

ruby-on-rails - postgresql 中的“Where-in”查询显示相同结果的两个不同查询

mysql - 正确的 SELECT 语句是什么?

sql - SUM(CASE...) 和 CASE WHEN...THENSUM(...) 的区别

sql - 查询不带键的 JSONB

sql - 使用 Teradata 限制子查询中的行数

mysql - 按对列结果查询

java - 无法为 hibernate 项目创建请求的服务 [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

ruby-on-rails - 是否可以在 rails 中有多个数据库连接池进行切换?

php - 如何从mysql结果中获取表名?

mysql - 删除 mySQL 中内部联接上的 "semi"重复项