Требуется помощь в написании запроса - PullRequest
5 голосов
/ 24 октября 2011

У меня есть 2 таблицы Table_A и Table_B. Table_A является родителем Table_B. Таблица_B имеет 2 столбца, которые ссылаются на Table_A (я имею в виду, что оба столбца относятся к столбцу в родительском элементе).

Таблица_A содержит следующие столбцы (id, name, className) Таблица_B содержит следующий столбец (источник, место назначения), оба столбца относятся к идентификатору в Table_A

Предположим, что Table_A содержит следующие данные

id     name    className 
---------------------------
1       N1      C1 
2       N2      C2
3       N3      C3
4       N4      C4
5       N5      C6

Table_B

Source  Destination
------------------
1        2
2        3
3        4
3        5

Мне нужен запрос, в котором мне требуются все идентификаторы, присутствующие в пункте назначения, а не в источнике, и мне нужно объединить эти идентификаторы с Table_A, чтобы получить name и className.

Для данных, которые я показал, запрос должен получить следующие строки.

4     N4   C4
5     N5   C5

Кстати, здесь я показал частичные данные, но Table_B имеет более 1000 записей.

EDIT

Я написал следующий запрос, но он показывал неправильные результаты

select * from Table_A where id not in (select distinct Source from Table_B)

Но в настоящее время он давал правильные результаты, но в долгосрочной перспективе мы можем столкнуться с проблемой производительности, а также запрос извлекает данные, которых нет ни в источнике, ни в пункте назначения.

Ответы [ 3 ]

5 голосов
/ 24 октября 2011

У меня установлен только SQLite, но этот короткий запрос сделал свою работу:

SELECT table1.id, table1.name
FROM table1, table2
WHERE table2.destination NOT IN
        (SELECT DISTINCT source FROM table2)
AND table1.id=table2.destination;

-- Result:
-- 4|N4
-- 5|N5

РЕДАКТИРОВАТЬ: Конечно, было бы интересно увидеть сравнение производительности с другими решениями.

2 голосов
/ 24 октября 2011

Вам нужно разделить вашу проблему на две части: первая - получение пунктов назначения, которых нет в источнике, вторая - объединение двух таблиц. Чтобы получить пункты назначения, которых нет в источнике, что-то вроде этого должно работать:

SELECT Destination FROM Table_B WHERE Destination NOT IN (SELECT Source AS Destination FROM Table_B)

Тогда нам нужно объединение, поэтому

SELECT Table_A.* FROM Table_A
JOIN Table_B on Table_A.id = Table_B.Destination
WHERE Destination NOT IN (SELECT Source AS Destination FROM Table_B)

Я не могу сказать, что это правильно, так как в данный момент у меня нет доступа к базе данных или анализатору запросов, но это должно поставить вас на правильный путь.

1 голос
/ 24 октября 2011
WITH T1 (id)
     AS
     (
      SELECT Destination
        FROM Table_B
      EXCEPT 
      SELECT Source
        FROM Table_B
     )
SELECT T2.id, T2.name, T2.className
  FROM T1 NATURAL JOIN Table_A AS T2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...