Как вставить записи, только если возвращаются 2+ записи? - PullRequest
0 голосов
/ 05 августа 2020

Итак, у меня есть забавный маленький l oop, который ищет повторяющиеся адреса. Наконец, я настроился, чтобы работать довольно быстро, но я не могу получить от него то, что мне нужно.

Примеры данных и ожидаемые результаты

Вот l oop:

WHILE @cnt <= @max
    BEGIN
        SELECT
            @customer_id=[customer_id],
            @add1   =[add1], 
            @add2   =[add2], 
            @add3   =[add3], 
            @zip    =[zip]
          FROM #tmpCustomers
          WHERE [id] = @cnt

        -- Ensures customer_id is not already in the dupeCustomerAddress table
        IF NOT EXISTS( SELECT [customer_id] FROM dupeCustomerAddress WHERE [customer_id] = @customer_id )
        BEGIN

            INSERT INTO dupeCustomerAddress
                SELECT
                    [customer_id],
                    [address1],
                    [add1],
                    [address2],
                    [add2],
                    [address3],
                    [add3],
                    [zip]
                  FROM [working_customerAddress]
                  WHERE
                    -- Removes the Record used for comparison
--                  [customer_id] != @customer_id AND
                    -- Don't need to include records already processed
                    [customer_id] > @cnt AND
                    (
                        (       -- Address Line 1 or 2 matches Comparison Line 1 AND Zip matches
                            (
                              ( [address1] IS NOT NULL AND [add1] = @add1 ) OR  
                              ( [address2] IS NOT NULL AND [add2] = @add1 ) 
                            ) AND [zip] = @zip
                        )
                        OR
                        (       -- Address Line 1 or 2 matches Comparison Line 2 AND Zip matches
                            (
                              ( [address1] IS NOT NULL AND [add1] = @add2 ) OR  
                              ( [address2] IS NOT NULL AND [add2] = @add2 ) 
                            ) AND [zip] = @zip
                        )
                    )
                    GROUP BY customer_id, add1, add2, add3, address1, address2, address3, zip
                    HAVING COUNT(customer_id) > 1
                    
    
        END 
        SET @cnt = @cnt + 1 
    END

Если я удалю GROUP BY и HAVING, он вернет каждую строку, поскольку #tmpCustomers - это всего лишь подмножество полей из working_customerAddress. В этом есть смысл.

Если я раскомментирую [customer_id] != @customer_id, то он предоставит мне только информацию о дублированной записи, а не информацию об исходной записи. Итак, если b и c являются дубликатами a, я получаю только b и c, но мне нужны a, b и c.

Я попытался добавить GROUP BY и HAVING, но затем Я вообще не получаю результатов. Все записи должны быть уникальными, так как это всего одна per customer_id, поэтому GROUP BY не должно быть проблемой. Может быть, HAVING не подходит.

Что мне не хватает?

Я использую последнюю версию MS SQL Server и SSMS

...