首页 > 解决方案 > 你能交叉加入一个查询的结果吗

问题描述

我有两个 ID 喜欢交叉连接的查询。这样的事情可能吗?

SELECT concat_ws(' ',first_name, last_name) adopters, d.name
FROM adopters
WHERE NOT EXISTS (SELECT adopter_id FROM dog_adoptions where adopter_id = id)
CROSS JOIN (SELECT name 
  FROM dogs 
  WHERE NOT EXISTS (SELECT dog_id FROM dog_adoptions WHERE dog_id = id)) d

对于上下文,这里是 sql fiddle 链接:http ://sqlfiddle.com/#!17/ac120/4349

问题是:“尚未选择狗的收养者收养并生成收养者和可用狗的所有可能组合。”

标签: sqlpostgresql

解决方案


是的,您只需要正确的语法。 CROSS JOIN-- 与所有JOIN 运算符一样 -- 是子句中识别的二元运算符。FROM所以你需要把它放在那里:

SELECT concat_ws(' ', a.first_name, a.last_name) as adopter, d.name
FROM adopters a CROSS JOIN
     (SELECT d.name 
      FROM dogs d
      WHERE NOT EXISTS (SELECT 1 FROM dog_adoptions da WHERE da.dog_id = d.id)
     ) d
WHERE NOT EXISTS (SELECT 1 FROM dog_adoptions da where da.adopter_id = a.id);

您还可以摆脱FROM子句中的子查询:

SELECT concat_ws(' ', a.first_name, a.last_name) as adopter, d.name
FROM adopters a CROSS JOIN
     dogs d
WHERE NOT EXISTS (SELECT 1 FROM dog_adoptions da where da.adopter_id = a.id) AND
      NOT EXISTS (SELECT 1 FROM dog_adoptions da WHERE da.dog_id = d.id)

推荐阅读