T-SQL - сравнить несколько столбцов в одной строке - PullRequest
1 голос
/ 15 февраля 2012

Мне нужно сравнить несколько столбцов из одной и той же строки в таблице. Например, у меня есть строка


1 |имя |фамилия |телефон |nameWeb |фамилияВеб |phoneWeb ...


и мне нужно сравнить данные из БД и данные из столбцов Web [.... Web] примерно так:


name |nameWeb


фамилия |фамилияВеб


телефон |phoneWeb ...


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

мой код

SELECT    
 -- Contatto
                c.id , 
 -- Ditta
                d.nome 'nomeDitta' ,
                d.filiale ,
                d.webNome webNomeDitta ,
                d.webDescrizione webDescrizione ,
-- Persona  
                p.nome Nome ,
                p.cognome Cognome ,
                p.email ,
                p.telefono ,
                p.fax ,
                p.webNome ,
                p.webCognome ,
                p.webEmail ,
                p.webTelefono ,
                p.webFax ,
                p.webNoteAggiuntive ,
                p.canali ,
-- Indirizzo
                i.indirizzo1 ,
                i.indirizzo2 ,
                i.cap ,
                i.localita ,
                i.webIndirizzo1 ,
                i.webIndirizzo2 ,
                i.webCap ,
                i.webLocalita ,
                i.webNome 'NomeInd' ,
-- Nazione
                n.stato 'Nazione' ,
                n2.stato 'webNazione' ,
-- Lingua
                L.nome 'webLingua'
        INTO    #webCont
        FROM    dbo.contatto c ...
        WHERE   c.id = @idContatto

        DECLARE @result TABLE ( ColumnName  NVARCHAR(100) ,
                                DB          NVARCHAR(100) ,
                                Web         NVARCHAR(100) ,
                                hasData     BIT)

        INSERT  INTO @result    SELECT  'Nome Ditta' , nomeDitta , webNomeDitta , @hasData   FROM    #webCont
        INSERT  INTO @result    SELECT  'Nome' , Nome , webNome , @hasData    FROM    #webCont
        INSERT  INTO @result    SELECT  'Cognome' , Cognome , webCognome , @hasData    FROM    #webCont
        INSERT  INTO @result    SELECT  'eMail' , email , webEmail , @hasData    FROM    #webCont
        INSERT  INTO @result    SELECT  'Telefono' , telefono , webTelefono , @hasData    FROM    #webCont
        INSERT  INTO @result    SELECT  'Fax' , fax , webFax , @hasData    FROM    #webCont
        INSERT  INTO @result    SELECT  'Indirizzo 1' , indirizzo1 , webIndirizzo1 , @hasData    FROM    #webCont
        INSERT  INTO @result    SELECT  'Indirizzo 2' , indirizzo2 , webIndirizzo2 , @hasData    FROM    #webCont
        INSERT  INTO @result    SELECT  'Cap' , cap , webCap , @hasData    FROM    #webCont
        INSERT  INTO @result    SELECT  'Localita' , localita , webLocalita , @hasData    FROM    #webCont
        INSERT  INTO @result    SELECT  'Nazione' , Nazione , webNazione , @hasData    FROM    #webCont

Спасибо, Мариан

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Я думаю, вам не нужна таблица @result, вместо нее можно использовать UNION. Также вам следует провести анализ вашего запроса, который мы не видим в вашем примере FROM dbo.contatto c ... Здесь описано, как это сделать. Возможно, вам тоже не нужно #webCont, но это действительно зависит. Возможно, вам следует рассмотреть возможность использования индексированных представлений , они замедляют операции, но могут использоваться для поиска в таблицах.

1 голос
/ 15 февраля 2012

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

  1. Поиск всех столбцов в конкретной таблице, НЕ заканчивающейся на "Web"
  2. Поиск всех столбцов в конкретной таблице, которые ДОЛЖНЫконец в "Web"
  3. Соедините эти два набора результатов вместе и создайте тест для измерения равенства
  4. Используйте объединенный набор результатов для создания динамического запроса, который будет выполнять и выполнять необходимые соответствиядля всех таблиц, которые могут иметь аналог «% Web».

Очевидно, что это решение не будет работать на 100% для вас, но может помочь вам найти решение, которое вам нужно.Итак, без лишних слов я представляю КОД:

DECLARE 
    @SQL nvarchar(max)
  , @TableName nvarchar(max)

SET @TableName = 'Test'

SET @SQL = 'SELECT '
;WITH NonWeb AS
(
SELECT
    [COLUMN_NAME] as [NonWebColumn]
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
    [TABLE_NAME] = @TableName
AND [COLUMN_NAME] NOT LIKE '%Web'
),
Web AS
(
SELECT
    '[' + C.[COLUMN_NAME] + ']' as [WebColumn]
  , '[' + NonWeb.[NonWebColumn] + ']' as [NonWebColumn]
  , 'CASE WHEN [' + C.[COLUMN_NAME] + '] = [' + NonWeb.[NonWebColumn] + '] THEN ''Equal'' ELSE ''Not Equal'' END as [' + NonWeb.[NonWebColumn] + 'Match]' as [Match]
FROM INFORMATION_SCHEMA.COLUMNS C
    INNER JOIN NonWeb ON
        REPLACE(C.[COLUMN_NAME],'Web','') = NonWeb.[NonWebColumn]
WHERE 
    [TABLE_NAME] = @TableName
AND [COLUMN_NAME] LIKE '%Web'
)

SELECT @SQL = 'SELECT ' + STUFF
(
    (
        SELECT
            ', ' + [NonWebColumn] + ', ' + [WebColumn] + ', ' + [Match]
        FROM Web
        FOR XML PATH('')
    )
  , 1
  , 2
  , ''
) + ' FROM ' + @TableName

EXEC sp_ExecuteSql @SQL

Вы можете просто изменить значение переменной @TableName (которая устанавливается в начале) на любое имя вашей конкретной таблицыи проверить это.Здесь предполагается, конечно, что в этой конкретной таблице есть столбцы, оканчивающиеся на «Web» ...

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