不同的JOIN类型可以给出相同的结果吗?

die*_*lar 1 sql postgresql join

我有以下架构:

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  name VARCHAR(40) NOT NULL,
  email VARCHAR(255) NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE sitters (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  user_id UUID REFERENCES users ON DELETE CASCADE UNIQUE NOT NULL,
  slug VARCHAR(255) NOT NULL,
  headline VARCHAR(255) NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE bookings (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  user_id UUID REFERENCES users ON DELETE CASCADE,
  sitter_id UUID REFERENCES sitters,
  start_date date NOT NULL,
  end_date date NOT NULL,
  pets_ids UUID[] NOT NULL,
  status VARCHAR(15) NOT NULL DEFAULT 'created',
  total_amount_cents INT NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE messages (
  id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
  booking_id UUID REFERENCES bookings ON DELETE CASCADE,
  sender_id UUID REFERENCES users ON DELETE CASCADE,
  receiver_id UUID REFERENCES users ON DELETE CASCADE,
  content TEXT NOT NULL,
  seen_at TIMESTAMPTZ,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
Run Code Online (Sandbox Code Playgroud)

所以:

  • 用户可以是保姆.
  • 预订有用户和保姆.
  • 消息属于唯一预订.

我想:

给出a user_id,a sitter_idbooking_id返回预订的消息,如果:

  • booking_id 已验证
  • 这预订ID匹配给定的user_id,sitter_id或两者兼而有之.

所以我得到了:

SELECT m.*,
b.user_id, b.sitter_id
FROM bookings b
LEFT JOIN messages m
ON m.booking_id=b.id
WHERE b.id=$1 AND (b.user_id=$2 OR b.sitter_id=$3);
Run Code Online (Sandbox Code Playgroud)

我想收到:

  • 没有预订不存在
  • 没有什么是没有的user_idsitter_id比赛
  • 如果预订存在但没有消息,则预订id字段

它工作正常,但尝试不同的JOINS后,我看到相同的结果.任何可能破坏的场景?

goo*_*uy5 6

你是什​​么意思:

它工作正常,但尝试不同的JOINS后,我看到相同的结果.任何可能破坏的场景?

看起来你在英语意义上使用"distinct"这个词,而不是在SQL意义上,这在SQL问题中有点令人困惑.

你加入了什么?

  • 任何与其他表的左连接应该没有效果,可能除了您的宠物表.
  • 如果找不到用户/保姆,则加入用户或参与者表可能会导致查询无效.

如果预订存在但我没有留言,我想收到预订ID字段

如果没有预订消息,您选择列的方式将导致空的预订ID.

  • 考虑手动列出所有列

请参阅我的简化SQLFiddle http://sqlfiddle.com/#!15/8b976/2
请同时考虑澄清您的问题.