Как избежать написания длинных операторов where в SQL, когда вы объединяете 2 таблицы с одинаковой схемой и проверяете равенство для всех полей, кроме одного? - PullRequest
0 голосов
/ 10 ноября 2018

Без написания большого количества условий, соединенных оператором AND в предложении where, можете ли вы внутренне объединить 2 таблицы с одинаковой схемой в SQL, так что предложение where проверяет равенство в каждом поле между двумя таблицами для всех, кроме одного поля?Оператор SQL становится слишком длинным, если полей много (скажем, 200 полей).Я использую MariaDB.

Например, скажем, у меня есть следующее, где 'id' является первичным ключом:

TABLE_A (идентификатор, имя, дата, происхождение, место жительства,пол, возраст, рост, вес)

TABLE_B (идентификатор, имя, дата, происхождение, место жительства, пол, возраст, рост, вес)

Когда я присоединяюсь к TABLE_A и TABLE_BЧтобы получить все строки, для которых значение в TABLE_A и соответствующее значение в TABLE_B одинаковы для всех полей, кроме id, я могу думать только о следующем:

SELECT * FROM TABLE_A INNER JOIN TABLE_B WHERE 
    TABLE_A.name = TABLE_B.name AND 
    TABLE_A.date = TABLE_B.date AND 
    TABLE_A.origin = TABLE_B.origin AND 
    TABLE_A.residence = TABLE_B.residence AND 
    TABLE_A.gender = TABLE_B.gender AND 
    TABLE_A.age = TABLE_B.age AND 
    TABLE_A.height = TABLE_B.height AND 
    TABLE_A.weight = TABLE_B.weight;

Есть ли лучший способчто не требует написания супер-длинного предложения WHERE?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Если вы скажете нам, что такое цель real , мы сможем найти решение, которое позволит избежать этого беспорядка WHERE. Между тем, вот несколько связанных запросов:

Это приведет к дедупликации набора строк:

        ( SELECT * FROM TableA )
        UNION DISTINCT
        ( SELECT * FROM TableB )

Так будет и так:

SELECT DISTINCT *
    FROM
    (
        ( SELECT * FROM TableA )
        UNION ALL
        ( SELECT * FROM TableB )
    )

Вот другой подход к размышлению. Это все еще много печатать, но вы можете скопировать и вставить, чтобы сделать часть работы:

SELECT ...
    FROM TableA
    JOIN TableB
      ON CONCAT_WS("\t", a.name, a.date, ... ) =
         CONCAT_WS("\t", b.name, b.date, ... )

Как получить список столбцов, не набирая их:

SET group_concat_len = 12345;  -- something big enough = 12345;
SELECT  GROUP_CONCAT(column_name)
    FROM  information_schema.columns
    WHERE  table_schema = '...'    -- use the database name
      AND  table_name = 'Table_A'
      AND  column_name != 'id';    -- to exclude `id`
0 голосов
/ 10 ноября 2018

Создайте подзапрос из каждой таблицы, переименовав один столбец в разные имена с помощью select as.Тогда natural join подзапросы.Это делает inner join using всех общих / оставшихся столбцов.(Или просто используйте один подзапрос и другую исходную таблицу.)

(Учтите, однако, что если ваша спецификация будет включать в будущем именно те столбцы, к которым вы присоединяетесь сейчас, к одному столбцу может быть добавлено больше столбцов.или обе таблицы, то вам нужно перечислить текущие столбцы - скажем, в using. Это похоже на select * против select определенных столбцов. Идеально, после того, как вы присоединитесь, как вы ожидаете получить на всехтекущие столбцы или текущие столбцы соединения? Если вы используете процесс сборки для уменьшения избыточности на select s, то вы можете просто использовать его на inner join.)

...