Sql server 显示重复的每一行

Sql server 显示重复的每一行,sql-server,Sql Server,我有一个包含重复行的表。例如,这是我的表 OriginalUrl NewUrl /blog /blog es/blog es/blog blog blog 现在我想得到如下副本 输出: OriginalUrl

我有一个包含重复行的表。例如,这是我的表

 OriginalUrl                           NewUrl
/blog                                 /blog
es/blog                               es/blog
blog                                  blog
现在我想得到如下副本

输出:

    OriginalUrl                           NewUrl
    /blog                                 /blog
    blog                                  blog
多亏了“Zohar Peled”,我通过这段代码实现了大部分功能

但当我添加不带(/)的博客时,我甚至会将其视为如上所示的副本。但这段代码不会出现这种情况。那么有人能帮我实现这一最终更新吗 在又一次目标转移后,我再次更新了我的CTE。
这是最后一次更新,因为即使您打算再次更改您的要求,我也受够了。
请接受我对未来问题的建议:

  • 尽你所能定义这个问题
  • 以ddl+dml的形式提供最精确的表结构和样本数据。
    不要链接到sqlfiddle,因为它有很多停机时间
  • 提供最准确的预期输出
  • 展示你解决问题的努力
这是最后一次更新的CTE,其他所有内容与上次更新时一样

使现代化 更新的样本数据(再次…)

我已经更新了CTE,将最后一个“/”字符中的所有内容都包含在“产品”中,因此前3行的产品现在是
/blog
,最后一行是
/es/blog
。因此,URL的协议和域部分之后的所有内容现在都被视为产品。注意-这也应适用于
https
和任何其他协议

;WITH CTE AS (

SELECT OriginalUrl, 
       NewUrl,
       RIGHT(OriginalUrl, 
             LEN(OriginalUrl) - 
                 CHARINDEX('/', OriginalUrl,
                     PATINDEX('%://%', OriginalUrl)+3 -- get the location right after '://' 
                 )+1 -- get the location right after the first / after the patindex
             ) As Product
FROM MyTable 
)
我对新CTE的查询与上次尝试时一样:

SELECT T1.OriginalUrl, T1.NewUrl,T2.Product 
FROM CTE T1 
INNER JOIN (
    SELECT Product
    FROM CTE
    GROUP BY Product 
    HAVING COUNT(1) > 1
) T2 ON(T1.Product = T2.Product)
以下是输出:

OriginalUrl                       NewUrl                            Product
---------------------------------------------------------------------------
/blog                             /blog                             /blog
http://gaming.corsair.com/blog    http://gaming.corsair.com/blog    /blog
http://www.corsair.com/blog       http://www.corsair.com/blog       /blog

早期版本 因此,重复是指在OriginalUrl列的最后一个
/
之后具有相同字符串的所有行?
如果是这样,您可能希望尝试以下方法:

-- Create sample table and data. 
-- DDL
create table MyTable (
  OriginalUrl varchar(50),
  NewUrl varchar(50)
)
-- DML
  insert into MyTable VALUES 
('/blog', '/en-us/blog'),
('/blog', '/en-us/blog'),
('http://www.corsair.com/blog', 'http://www.corsair.com/blog'),
('http://gaming.corsair.com/blog', 'http://gaming.corsair.com/blog'),
('blablabla/blog', 'yadayada/blog'),
('I don''t see what is wrong with this/Answer', 'It seems to be working/Fine'),
('Unless my/Answer', 'assumes duplicates as something else then/you'),
('300r', '300r')
SELECT T1.OriginalUrl, T1.NewUrl,T2.Product 
FROM CTE T1 
INNER JOIN (
    SELECT Product
    FROM CTE
    GROUP BY Product 
    HAVING COUNT(1) > 1
) T2 ON(T1.Product = T2.Product)
注意:在询问有关sql的问题时,您应该使用这种方式提供示例数据。
通过这种方式,我们可以将您的DDL+DML复制到SQLFIDLE或我们自己的环境中,并实际测试我们给出的答案

我使用了一个隔离的方法来隔离样本数据中最后一个/后面的最后一个单词, 这样我只需要写一次正确的表达式

;WITH CTE AS (
SELECT OriginalUrl, 
        NewUrl,
        RIGHT(OriginalUrl, CASE WHEN CHARINDEX('/', OriginalUrl) > 0 THEN
                               CHARINDEX('/', REVERSE(OriginalUrl))-1
                           ELSE 
                               LEN(OriginalUrl)
                           END) As Product
FROM MyTable 
)

SELECT DISTINCT T1.OriginalUrl, T1.NewUrl,T1.Product 
FROM CTE T1 
INNER JOIN CTE T2
ON(T1.Product = T2.Product)
WHERE T1.OriginalUrl <> T2.OriginalUrl 
结果:

    OriginalUrl                                        NewUrl                                             Product
    -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
    I don't see what is wrong with this/Answer         It seems to be working/Fine                        Answer
    Unless my/Answer                                   assumes duplicates as something else then/you      Answer
    /blog                                              /en-us/blog                                        blog
    /blog                                              /en-us/blog                                        blog
    http://www.corsair.com/blog                        http://www.corsair.com/blog                        blog
    http://gaming.corsair.com/blog                     http://gaming.corsair.com/blog                     blog
    blablabla/blog                                     yadayada/blog                                      blog

你能为你的案例清楚地定义什么是“重复”吗?博客或这3个都是重复的。因为只有url改变,而不是产品的名称为什么300r不重复?我必须在“/”问题不清楚后检查答案,但如果有两次,就不会显示博客,我的意思是,如果只有产品博客出现两次,我不知道你的意思,那么。我已经在我的环境中进行了测试,结果完全符合您的预期结果。我本来会提供一个指向sqlfiddle的链接,但它目前不起作用。同时,请再次插入“/blog”并查看结果。它会显示blog一次,即使存在twiceNo,也会向您显示结果窗格,以便您可以查看我得到的结果并告诉我此答案的错误。(我在示例数据中又添加了一个/blog和2个/answer URL,对我来说似乎工作得很好)查看我的上一次编辑。首先,您应该将其包含在示例数据中。这会为我们俩节省一些时间和精力。
SELECT T1.OriginalUrl, T1.NewUrl,T2.Product 
FROM CTE T1 
INNER JOIN (
    SELECT Product
    FROM CTE
    GROUP BY Product 
    HAVING COUNT(1) > 1
) T2 ON(T1.Product = T2.Product)
    OriginalUrl                                        NewUrl                                             Product
    -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
    I don't see what is wrong with this/Answer         It seems to be working/Fine                        Answer
    Unless my/Answer                                   assumes duplicates as something else then/you      Answer
    /blog                                              /en-us/blog                                        blog
    /blog                                              /en-us/blog                                        blog
    http://www.corsair.com/blog                        http://www.corsair.com/blog                        blog
    http://gaming.corsair.com/blog                     http://gaming.corsair.com/blog                     blog
    blablabla/blog                                     yadayada/blog                                      blog