Осталось присоединиться к IS NULL - PullRequest
0 голосов
/ 01 октября 2018

У меня есть 2 таблицы Users (имя TEXT) и 'Coffee Breaks' (Person1 TEXT, Person2 TEXT).

Мне нужно написать объединение, которое вернет всех пользователей, которых у данного пользователя не былоПерерыв на кофе с.

Я пытаюсь выполнить левое соединение с IS NULL на правой стороне.

Запрос базы данных завершается без ошибок, но я не получаю пользователей врезультат.Проблема с моей строкой SQL-запроса?

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

Пример данных:

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);
      }
    });
  });
};

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Попробуйте изменить эту часть

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)
0 голосов
/ 01 октября 2018

Я бы ожидал что-то вроде этого:

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 = ?)
                 );

? является заполнителем для интересующего человека.

...