Как удалить повторяющиеся значения из ОБЪЕДИНЕНИЯ двух таблиц?

#sql #soql

#sql #soql

Вопрос:

Я был бы признателен за небольшую помощь!

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

 SELECT
Column1 AS FIRST_COL, 
Column2 AS SECOND_COL, 
Column3 AS THIRD_COL, 
Column4 AS FOURTH_COL, 
Phone AS PHONE, 
Column6 AS SIXTH_COl,
FROM Standard_Table
WHERE Column01 = 'xy01'
UNION ALL
SELECT 
FIRST_COL,
SECOND_COL,
THIRD_COL,
FOURTH_COL,
PHONE,
SIXTH_COL,
FROM Special_Table
WHERE COLUMN01 = 'xy'
 

Дело в том, что я хотел бы избавиться от повторяющихся пользователей на основе их телефонных номеров (столбец ТЕЛЕФОНА).
Некоторые пользователи находятся в обеих таблицах, но их записи не согласованы между таблицами, поэтому DISTINCT не будет работать.

Каков наилучший способ сделать это?

Комментарии:

1. Пожалуйста, предоставьте примеры данных и желаемые результаты.

Ответ №1:

Если я правильно понимаю, вы можете выбрать из первой таблицы, а затем выбрать несопоставимые строки из второй:

 SELECT Column1 AS FIRST_COL,  Column2 AS SECOND_COL,  Column3 AS THIRD_COL, Column4 AS FOURTH_COL, 
       Phone AS PHONE, Column6 AS SIXTH_COl,
FROM Standard_Table
WHERE Column01 = 'xy01'
UNION ALL
SELECT FIRST_COL, SECOND_COL, THIRD_COL, FOURTH_COL,
       PHONE, SIXTH_COL,
FROM Special_Table sp
WHERE COLUMN01 = 'xy' AND
      NOT EXISTS (SELECT 1
                  FROM Standard_Table s
                  WHERE s.phone = sp.phone AND
                        s.Column01 = 'xy01'
                 );
 

Комментарии:

1. @Amberjack . , , Это может быть потому, что телефон дублируется в одной из таблиц.

2. Хорошо, извините. Это может действительно сработать, но проблема в том, что в моем реальном запросе я использую CASE WHEN в столбцах phone для их редактирования.

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

Ответ №2:

В этом случае можно использовать подзапросы. Во 2- й части может быть добавлено дополнительное условие следующим образом:

 SELECT
Column1 AS FIRST_COL,
Column3 AS THIRD_COL, 
Column4 AS FOURTH_COL, 
Phone AS PHONE, 
Column6 AS SIXTH_COl,
FROM Standard_Table
WHERE Column01 = 'xy01'
UNION ALL
SELECT 
FIRST_COL,
SECOND_COL,
THIRD_COL,
FOURTH_COL,
PHONE,
SIXTH_COL,
FROM Special_Table
WHERE COLUMN01 = 'xy' AND 
PHONE NOT IN (
  SELECT Phone
  FROM Standard_Table
);
 

Комментарии:

1. Это приводит только к строкам из Standard_table . Строки из Special_Table вообще не возвращаются.

2. ДА. Он будет возвращать значения из Special_Table только в том случае, если номер телефона еще не указан в Standard_Table. Разве это не то, что вы хотели?

Ответ №3:

Надеюсь, это сработает для вас

 ; WITH PartionedData AS (
    SELECT *, 
            ROW_NUMBER() OVER (PARTITION BY PHONE ORDER BY FIRST_COL) RowNum
    FROM (
        SELECT 
        Column1 AS FIRST_COL,
        Column3 AS THIRD_COL, 
        Column4 AS FOURTH_COL, 
        Phone AS PHONE, 
        Column6 AS SIXTH_COl,
        FROM Standard_Table
        WHERE Column01 = 'xy01'
        UNION ALL
        SELECT 
        FIRST_COL,
        SECOND_COL,
        THIRD_COL,
        FOURTH_COL,
        PHONE,
        SIXTH_COL,
        FROM Special_Table
        WHERE COLUMN01 = 'xy' AND 
        PHONE NOT IN (
          SELECT Phone
          FROM Standard_Table
        ) CombinedData
)
SELECT 
FIRST_COL,
THIRD_COL, 
FOURTH_COL, 
PHONE, 
SIXTH_COl,
FROM PartionedData
WHERE RowNum = 1
 

Ответ №4:

Хотя и UNION, и UNION ALL используются для объединения результатов двух запросов SELECT, основное различие между ними заключается в том, что UNION не включает повторяющуюся запись, а UNION ALL включает. Еще одно различие между ними заключается в том, что UNION ALL работает быстрее, чем UNION, но может выглядеть медленным, потому что он возвращает больше данных, для передачи которых по сети требуется больше времени.

Итак, вы можете попробовать использовать ОБЪЕДИНЕНИЕ