вопрос SQL - PullRequest
       4

вопрос SQL

0 голосов
/ 28 февраля 2011

у меня есть таблицы

Таблица 1

id text
1   A
1   B
2   C

Таблица 2

id text
1  x
1  f  
2  y
2  z

Я хочу присоединиться к ним таким образом

1 A x
1 B f
2 C y
2   z

Другими словами, я хочу видеть все тексты из таблицы1 и таблицы2, сгруппированные по идентификатору, без повторов. Есть идеи?

Обновление : как говорится в комментариях, логика не ясна, я постараюсь объяснить. У меня есть текущие значения в таблице_1 и удаленные значения в таблице_2. Клиент хочет видеть текущие значения и удаленные значения в одной таблице, сгруппированной по некоторому идентификатору.

Ответы [ 3 ]

1 голос
/ 28 февраля 2011

Простое решение, позволяющее получить что-то близкое к тому, что вы ищете

SELECT t1.id, t1.text, t2.text
FROM tbl_1 t1
  INNER JOIN tbl_2 t2
    ON t1.id = t2.id

. Это создаст вывод

1 A x
1 B x
2 C y
2 C z

Теперь все по-другому, когда дублирующиеся тексты x иC должен быть как-то удален.

Обновление предварительное условие: дубликаты для идентификатора либо в tbl_1, либо в tbl_2, но не оба!

Присоединение к групповому выборув дополнение к вышесказанному простое решение позволит создать вид «CASE-фильтров» для получения желаемого результата.

SELECT
  t1.id,
  CASE
    WHEN t2.text = txt_i2 THEN t1.text
  END AS txt_t1,
  CASE
    WHEN t1.text = txt_i1 THEN t2.text
  END AS txt_t2
FROM (
    SELECT
      i1.id,
      i1.text AS txt_i1,
      i2.text AS txt_i2
    FROM tbl_1 i1
      INNER JOIN tbl_2 i2
        ON i1.id = i2.id
    GROUP BY id
  ) i
  INNER JOIN tbl_1 t1
    ON i.id = t1.id
  INNER JOIN tbl_2 t2
    ON t1.id = t2.id

Вы должны создать представление tbl_1-tbl_2-join, чтобы получить более читаемый SQL:

CREATE OR REPLACE VIEW V_tbl_1_2 AS (
SELECT 
  t1.id,
  t1.text AS txt_1,
  t2.text AS txt_2
FROM tbl_1 t1
  INNER JOIN tbl_2 t2
    ON t1.id = t2.id
)
;

SELECT
  t.id,
  CASE
    WHEN t.txt_2 = i.txt_2 THEN t.txt_1
  END AS txt_t1,
  CASE
    WHEN t.txt_1 = i.txt_1 THEN t.txt_2
  END AS txt_t2
FROM V_tbl_1_2 t
  INNER JOIN (
    SELECT *
    FROM V_tbl_1_2
    GROUP BY id
  ) i ON t.id = i.id
;
0 голосов
/ 28 февраля 2011

Это работает, если вы можете иметь не более двух элементов на id в любой таблице и если ни один из них не имеет полных дубликатов. (И я должен также добавить, что это может работать, только если MySQL может проглотить этого монстра и не подавиться им.)

SELECT
  COALESCE (t1.id, t2.id) AS id,
  t1.text AS text1,
  t2.text AS text2
FROM (
  SELECT
    t.id,
    t.text,
    CASE t.text WHEN m.text THEN 1 ELSE 2 END AS rowid
  FROM table_1 t
    INNER JOIN (
      SELECT id, MIN(text) AS text
      FROM table_1
      GROUP BY id
    ) m ON t.id = m.id
) t1
FULL JOIN (
  SELECT
    t.id,
    t.text,
    CASE t.text WHEN m.text THEN 1 ELSE 2 END AS rowid
  FROM table_2 t
    INNER JOIN (
      SELECT id, MIN(text) AS text
      FROM table_2
      GROUP BY id
    ) m ON t.id = m.id
) t2
ON t1.id = t2.id AND t1.rowid = t2.rowid
ORDER BY COALESCE (t1.id, t2.id), COALESCE (t1.rowid, t2.rowid)
0 голосов
/ 28 февраля 2011

ИСПОЛЬЗОВАТЬ MYSQL ПРОСМОТР ИЛИ ПРИСОЕДИНИТЬСЯ

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