Запросить три не разбитых на части набора данных - PullRequest
0 голосов
/ 24 декабря 2008

Я получаю три разных набора данных (или то, что должно быть «уникальными» строками). В общей сложности я ожидаю 3 разных уникальных набора строк, потому что мне нужно выполнять разные операции с каждым набором данных. Я, однако, получаю больше строк, чем их общее количество в таблице, что означает, что я должен где-то извлекать повторяющиеся строки. Вот пример моих трех наборов запросов:

SELECT DISTINCT t1.*
    FROM table1 t1
    INNER JOIN table2 t2
        ON t2.ID = t1.ID
            AND t2.NAME = t1.NAME
            AND t2.ADDRESS <> t1.ADDRESS


SELECT DISTINCT t1.*
    FROM table1 t1
    INNER JOIN table2 t2
        ON t2.ID = t1.ID
            AND t2.NAME <> t1.NAME
            AND t2.ADDRESS <> t1.ADDRESS


SELECT DISTINCT t1.*
    FROM table1 t1
    INNER JOIN table2 t2
        ON t2.ID <> t1.ID
            AND t2.NAME = t1.NAME
            AND t2.ADDRESS <> t1.ADDRESS

Как видите, я выбираю (в порядке запросов)

  • Набор данных, где идентификатор и имя совпадают
  • Набор данных, где идентификатор совпадает, но имя НЕ
  • Набор данных, где идентификатор не совпадает, но имя DOES

Я получаю больше строк, чем существует в T1, когда складываю количество результатов, возвращаемых по всем трем запросам, что я не считаю логически возможным, плюс это означает, что я должен где-то дублировать строки (если это возможно логически) что мешает мне выполнять разные команды для каждого набора (так как в строке будет выполняться другая команда).

Может кто-нибудь найти, где я иду не так?

Ответы [ 5 ]

2 голосов
/ 24 декабря 2008

Рассмотрим, если Имя не является уникальным. Если у вас есть следующие данные:

Table 1                        Table 2
ID    Name      Address        ID    Name      Address
0     Jim Smith 1111 A St      0     Jim Smith 2222 A St
1     Jim Smith 2222 B St      1     Jim Smith 3333 C St

Тогда Query 1 дает вам:

0     Jim Smith 1111 A St
1     Jim Smith 2222 B St 

Поскольку строки 1 и 2 в таблице 1 соответствуют строкам 1 и 2 соответственно в таблице 2.

Запрос 2 ничего не дает.

Запрос 3 дает вам

0     Jim Smith 1111 A St
1     Jim Smith 2222 B St

Поскольку строка 1 в Таблице 1 соответствует строке 2 в Таблице 2, а строка 2 в Таблице 1 соответствует строке 1 в Таблице 2. Таким образом, вы получаете 4 строки из Таблицы 1, когда в ней только 2 строки.

1 голос
/ 24 декабря 2008

Предполагая, что T2.ID имеет уникальное ограничение, этот сценарий все еще вполне логично возможен. Если для каждой записи в T1 есть две соответствующие записи в T2:

  1. То же имя, тот же идентификатор, другой адрес
  2. То же имя, другой идентификатор, другой адрес

Тогда одна и та же запись для T1 может появиться, например, в первом и третьем запросе.

Также возможно одновременно получить одну и ту же строку во втором и третьем запросе.

Если T2.ID не гарантированно является уникальным, то вы можете получить одну и ту же строку из T1 во всех трех запросах.

1 голос
/ 24 декабря 2008

Вы уверены, что NAME и ID уникальны в обеих таблицах?

Если нет, у вас может возникнуть ситуация, например, где в таблице 1 есть это:

ИМЯ: Фред ID: 1

и таблица2 имеет это:

ИМЯ: Фред ID: 1

ИМЯ: Фред ID: 2

В этом случае запись в таблице1 будет возвращена двумя вашими запросами: ID и NAME совпадают, а NAME совпадают, но ID не совпадает.

Возможно, вам удастся сузить проблему, пересекая каждую комбинацию двух запросов, чтобы выяснить, что такое дубликаты, например ::

SELECT DISTINCT t1.*
    FROM table1 t1
    INNER JOIN table2 t2
        ON t2.ID = t1.ID
                AND t2.NAME = t1.NAME
                AND t2.ADDRESS <> t1.ADDRESS
INTERSECT
SELECT DISTINCT t1.*
    FROM table1 t1
    INNER JOIN table2 t2
        ON t2.ID = t1.ID
                AND t2.NAME <> t1.NAME
                AND t2.ADDRESS <> t1.ADDRESS
0 голосов
/ 25 декабря 2008

Чтобы найти оскорбительные данные (и помочь найти вашу логическую дыру), я бы порекомендовал:

(псевдокод предостережения)

Ограничить результаты только SELECT ID FROM ....

  • UNION наборы результатов

  • COUNT (ID)

  • GROUP BY id

  • Количество (id)> 1

Это покажет записи, которые соответствуют более чем одному подзапросу.

0 голосов
/ 24 декабря 2008

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

т.е. Он полагается на сопоставление имен в обеих таблицах (а не на ID)

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