postgresql 如何加入一对零或一的关系?

11dmarpk  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(1)|浏览(145)

我使用的是node.js typeorm,我有两个实体,它们之间的关系为1对0或1,如下所示:

@Entity('issuer')
export class Issuer {
  @PrimaryGeneratedColumn()
  issuerId: number

  @OneToOne(() => User)
  @JoinColumn({ name: 'userId' })
  user: User
  
  ...remaining columns...
}

@Entity('user_data')
export class User {
  @PrimaryGeneratedColumn()
  id: number

  @Column({ type: 'varchar', nullable: false, unique: true })
  email: string

  ...remaining columns...
}

用户可以是或不是发行者,但发行者肯定是用户。
我试图实现的是,在不知道用户类型的情况下,我想连接2个表。例如,考虑以下数据库行:

User  | id | email | 
--------------------
user1 | 1  | xx@xx |
--------------------
user2 | 2  | yy@yy |

Issuer  | issuerId | userId |
----------------------------
issuer1 |    1     |    1   |

当我查询电子邮件xx@xx时,我想得到:

id: 1, email: xx@xx, issuerId: 1

当我查询电子邮件yy@yy时,我想得到:

id: 2, email: yy@yy, issuerId: NULL

或者如果issuerId为NULL,则丢弃它也是可以的。
我尝试了以下查询:

SELECT *
FROM user_data
LEFT JOIN issuer ON issuer.userId = user_data.id
WHERE user_data.email = $1

其中$1是电子邮件参数,但我得到以下错误:

"severity": "ERROR",
"code": "42703",
"hint": "Perhaps you meant to reference the column \"issuer.userId\".",
"file": "parse_relation.c",
"routine": "errorMissingColumn"

我做错了什么,我能做些什么来实现我的目标?

brgchamk

brgchamk1#

看起来在使用驼峰大小写列名时,应该用双引号括起来。另外,我应该使用LEFT OUTER JOIN而不是LEFT JOIN。
更正后的查询如下所示:

SELECT *
FROM user_data
LEFT OUTER JOIN issuer ON issuer."userId" = user_data.id
WHERE user_data.email = $1

相关问题