Sql 与的左连接为空

Sql 与的左连接为空,sql,node.js,sqlite,join,left-join,Sql,Node.js,Sqlite,Join,Left Join,我有两个表用户(姓名文本)和“咖啡休息时间”(Person1文本,Person2文本) 我需要编写一个连接,它将返回给定用户没有与之喝过咖啡的所有用户 我正在尝试使用右侧的IS NULL进行左连接 db查询正在顺利完成,但结果中没有任何用户。我的SQL查询字符串有问题吗 SQL: 样本数据: Users [ { Name: "Casey" }, { Name: "Jake" }, { Name: "Mark" }, { Name: "S

我有两个表用户(姓名文本)和“咖啡休息时间”(Person1文本,Person2文本)

我需要编写一个连接,它将返回给定用户没有与之喝过咖啡的所有用户

我正在尝试使用右侧的IS NULL进行左连接

db查询正在顺利完成,但结果中没有任何用户。我的SQL查询字符串有问题吗

SQL:

样本数据:

Users
[
  {
    Name: "Casey"
  },
  {
    Name: "Jake"
  },
  {
    Name: "Mark"
  },
  {
    Name: "Steve"
  }
]

Coffee Breaks
[
  {
    Person1: "Steve",
    Person2: "Casey"
  }
]
服务器代码:

db.neverCoffeed = function(user) {
  const sql = `WITH bilateral(p1, p2) AS (SELECT Person1 AS p1, Person2 AS p2 FROM "Coffee Breaks"
    UNION ALL SELECT Person2 AS p1, Person1 AS p2 FROM "Coffee Breaks"
    GROUP BY p1, p2)
  SELECT * FROM Users u1, Users u2
    LEFT JOIN bilateral bi ON u1.Name=bi.p1 AND u2.Name=bi.p2
    WHERE bi.p1 IS NULL`;
  return new Promise((resolve, reject) => {
    this.run(sql, (err, users) => {
      if (err) {
        reject(err);
      }
      else {
        console.log('users', users)
        resolve(users);
      }
    });
  });
};

我希望这样:

select u.*
from users u
where not exists (select 1
                  from coffeebreaks cb
                  where (cb.person1 = u.name and cb.person2 = ?) or
                        (cb.person2 = u.name and cb.person1 = ?)
                 );

是感兴趣的人的占位符。

尝试更改此部分

SELECT * FROM Users u1, Users u2
    LEFT JOIN bilateral bi ON u1.Name=bi.p1 AND u2.Name=bi.p2
    WHERE bi.p1 IS NULL


SQLite只是将逗号视为拼写为“交叉连接”。在标准的SQL逗号ie中,“隐式连接”意味着交叉连接,但它比使用join关键字的“显式连接”绑定得更松散。因此,不要将隐式连接与显式连接混合。(如果这样做,请将逗号连接放在最后。)在另一个DBMS中,您的代码意味着先左连接,然后交叉连接。这将给出一个错误,因为没有u1。左侧的列连接。请阅读并执行操作。通过代码的一部分来证明所需功能的“有问题的最小代码”,该部分代码可用于该功能的最大部分。说明您的程序在通过(子)表达式时会计算出您期望的值,包括传递给每个函数/运算符的参数满足其要求,说明这是什么&说明它实际上是通过增量输出完成的。询问示例之间的(小)差异。这是基本的调试。PS您对作为输出函数的期望输出的描述不是很清楚。您是否理解您的group by适用于union的第二个参数,而不是union?对称性表明您不想只对其中一个选择进行分组。无论你想做什么,都很难知道你想用它做什么。给定最后的左连接左输入,右表中是否有重复的用户对并不重要,因为您只保留不匹配的行。但是,如果您确实希望在并集之后使用唯一对,那么您可以只使用union[distinct]而不是union all的group by。
SELECT * FROM Users u1, Users u2
    LEFT JOIN bilateral bi ON u1.Name=bi.p1 AND u2.Name=bi.p2
    WHERE bi.p1 IS NULL
(SELECT * FROM Users u1
    LEFT JOIN bilateral bi ON u1.Name=bi.p1
    WHERE bi.p1 IS NULL
UNION ALL
SELECT * FROM Users u2
    LEFT JOIN bilateral bi ON u2.Name=bi.p2
    WHERE bi.p2 IS NULL)