Найти все столбцы с разными значениями для двух строк в одной таблице

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть таблица, в которой, в частности, две записи, из которых я ищу различия. В этой таблице достаточно столбцов, и я хотел бы, чтобы в ней отображались только разные. Я хотел бы определить, какие значения столбцов для этих двух записей отличаются. Это —

 table_one
|------------------------------------------------------------------------------------------|
| key_id | order_number | serial_code | order_date | idk_more_data_one | idk_more_data_two |
|------------------------------------------------------------------------------------------|
|  0000  |     45576    |    f56b22   |  20200101  |       22000       |        99.4       |
|  0001  |     45576    |    f56b22   |  20200101  |       23000       |        91.7       |
|  0002  |     45577    |    rt1000   |  20200101  |       19500       |        93.3       |
|  0003  |     45577    |    rt1000   |  20200101  |       20000       |        93.3       |
|  0004  |     45577    |    rt1000   |  20200101  |       19750       |        93.3       |
|------------------------------------------------------------------------------------------|
  

Мне нужен запрос, который извлекает только key_id значения 0000 и 0001 , а затем отображает только столбцы key_id , idk_more_data_one , и idk_more_data_two , потому что это единственные столбцы, которые изменились.

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

 Select *
From
    (Select *
    From table_one
    Where order_number = '45576')
Where
  

но не мог понять, что даст мне правильный эффект в Where части инструкции.

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

1. Пожалуйста, укажите в своем вопросе базу данных, которую вы используете: mysql, oracle, sqlserver …?

2. Как мне узнать, какой у меня есть? Я использую его в MS SQL Server Management Studio, означает ли это, что это sqlserver? Рад обновить теги, я просто … не знаю?

3. Вы хотите сравнить только идентификатор ключа 0000 и 0001? или вы хотите сравнить записи для каждого ключа с любыми другими для одного и того же номера заказа?

4. Только эти две, я просто хотел проиллюстрировать, что в таблице больше этих двух, и я выбираю из нее только эти две строки. Прошу прощения, если дополнительная информация была скорее запутанной, чем полезной.

Ответ №1:

Я не совсем уверен, что вы ищете, но если вы пытаетесь выполнить поиск в 2 реестрах по и key_id и в этих 3 полях:

 SELECT key_id, idk_more_data_one, idk_more_data_two 
FROM table_one 
WHERE key_id IN ("0000","0001")
  

ИЗДАНИЕ ПОСЛЕ КОММЕНТАРИЯ:

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

Прежде всего, вам нужно будет создать и сохранить Procedure (SP) для такого рода запросов, SP должен будет принять по крайней мере один параметр, который будет varchar длиной N (столько, сколько вы считаете возможным) и будет содержать столбцы, которые вы собираетесь запрашивать.

Затем вам нужно будет создать свой запрос в виде строки, в которую вы будете объединять свои параметры:

 ALTER/CREATE PROCEDURE sp_whatevername
@columns varchar(200)
AS
BEGIN
    @DECLARE Query varchar(500)
    SET Query = 'SELECT '   @columns   ' FROM tbl_one'
    EXEC (Query)
END
  

Как я уже сказал, это может быть не лучшим подходом из-за использования «EXEC», который в mssql может нанести вред при неправильном использовании, и вы должны быть очень осторожны с тем, что вы разрешаете получать в своей БД, потому что вы откроете там одну большую открытую дверь.

Итак, чтобы добавить оператор where, вам нужно будет сделать то же самое, добавив к нему WHERE перед statetment

 ALTER/CREATE PROCEDURE sp_whatevername
@columns varchar(200),
@where varchar(200)
AS
BEGIN
    @DECLARE Query varchar(500)
    SET Query = 'SELECT '   @columns   ' FROM tbl_one '   @where
    EXEC (Query)
END
  

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

1. Проблема в том, что я не знаю, какими будут столбцы idk_more_data_one и idk_more_data_two. Просто чтобы выбросить некоторые числа, есть тридцать столбцов, и, возможно, три из них будут разными … но я не знаю, какие столбцы отличаются. Мне понадобятся некоторые Select [term dependent on the Where term] .

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