«Отдельные» результаты SQL-запроса с использованием таблицы сопоставлений - PullRequest
2 голосов
/ 09 февраля 2009

У меня есть две таблицы tbl1 и tbl2, обе с двумя столбцами, одна для идентификатора и одна для продукта. Я хочу извлечь строки, которые находятся в обоих, то есть строки, где tbl1.id = tbl2.id и tbl1.product = tbl2.product и объединить строки из tbl1 и tbl2 в одну строку.

Я полагаю, это выглядит примерно так:

SELECT tbl1.\*, tbl2.\*
FROM tbl1, tbl2
WHERE tbl1.id = tbl2.id
  AND tbl1.product = tbl2.product

или

SELECT tbl1.\*, tbl2.\*
FROM tbl1
  INNER JOIN tbl2 
    ON tbl1.id = tbl2.id
       AND tbl1.product = tbl2.product

У меня есть дополнительная проблема, из-за которой продукты не имеют одинаковых имен в двух электронных таблицах.

Я добавил таблицу сопоставлений, которая содержит название продукта в tbl1 и соответствующее имя продукта tbl2 в каждой строке.

Как узнать, как получить эквивалент SQL-запроса, указанного выше, с помощью этой добавленной таблицы? (где выводится только одна строка для каждой комбинации id / product, существующей в обеих)?

Спасибо за любую помощь.

(Примечание: я использую MS Access)

Ответы [ 3 ]

3 голосов
/ 09 февраля 2009
SELECT
     t1.id,
     t1.product,
     t2.product
FROM
     tbl1 t1
LEFT OUTER JOIN mapping_table map ON
     map.id = tbl1.id
INNER JOIN tbl2 t2 ON
     t2.id = t1.id AND
     (t2.product = t1.product OR t2.product = map.tbl2_product)

Возможно, вам придется настроить это в зависимости от того, хотите ли вы, чтобы строки считались совпадающими, если названия продуктов из t1 и t2 совпадают, но в таблице карт также есть совпадение. Кроме того, если вы планируете иметь все продукты в таблице сопоставления, даже если имена уже совпадают между ними.

0 голосов
/ 10 февраля 2009

Просто используйте один из столбцов из таблицы сопоставления.

0 голосов
/ 09 февраля 2009
SELECT 
     tbl1.*, tbl2.*
FROM tbl1, tbl2, tbl3
 WHERE
     tbl1.id = tbl2.id
 AND tbl1.product = tbl3.product1
 AND tbl2.product = tbl3.product2
...