【问题标题】:Can someone walk me through this problem step by step-Symmetric Pairs problem有人可以逐步指导我解决这个问题吗?对称对问题
【发布时间】:2018-10-04 03:12:33
【问题描述】:

有人可以帮助初学者了解在 MS SQL Server 中解决此问题的过程。如果你有任何课程,你会推荐那也会很棒。我已经采取了一些,但他们没有装备我来解决这个问题。我是初学者。谢谢

【问题讨论】:

  • 欢迎来到 StackOverflow!如前所述,您的问题不适合本网站。请阅读How to Ask。这里的好问题确定了可以通过特定答案解决的特定编程问题。我将从谷歌搜索“SQL Symmetric Pairs Problem”开始。
  • 拜托,我们需要看看你尝试了什么——你尝试的 SQL 查询

标签: sql-server


【解决方案1】:

基本上,您需要执行某种将数据连接到自身(也称为自连接)的方式,以便能够检查给定条件:

x1 = y2 and x2 = y1

我们可以使用以下查询来获取所有对:

DECLARE @DataSource TABLE
(
    [x] INT
   ,[y] INT
);

INSERT INTO @DataSource ([x], [y])
VALUES (20, 20)
      ,(20, 20)
      ,(20, 21)
      ,(23, 22)
      ,(22, 23)
      ,(21, 20);


WITH DataSource AS
(
    SELECT [x]
          ,[y]
          ,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS [RowID]
    FROM @DataSource
)
SELECT *
FROM DataSource DS1
INNER JOIN DataSource DS2
    ON DS1.[x] = DS2.[y]
    AND DS1.[y] = DS2.[x]
WHERE DS1.[RowID] <> DS2.[RowID];

使用ROW_NUMBER,我们为每一行生成一个唯一的ID,以确保它不会连接到自身。

在您的示例结果中,您只有该对的第一部分(x1 &lt; x2 并且您获得唯一值。因此,我们可以稍微更改查询:

SELECT DISTINCT [x]
               ,[y]
FROM @DataSource DS1
WHERE EXISTS
(
    SELECT 1
    FROM @DataSource DS2
    WHERE DS1.[x] = DS2.[y]
        AND DS1.[y] = DS2.[x]
        AND DS1.[X] <= DS2.[x]
)
ORDER BY [x];

它有一个小变化。我们正在寻找这对的一部分,x1&lt;x2。当然,如果您对连接更满意,您可以这样做:

SELECT DISTINCT DS1.[x]
               ,DS1.[y]
FROM @DataSource DS1
INNER JOIN @DataSource DS2
    ON DS1.[x] = DS2.[y]
    AND DS1.[y] = DS2.[x]
    AND DS1.[x] <= DS2.[x]
ORDER BY DS1.[x];

【讨论】:

    【解决方案2】:
    /* Case 1: Cases where x=y and have more than one record */
    with tempa as
    (
        select x,y
        from functions
        where x=y
        group by x,y
        having count(*)>=2
    ),
    /* Case 2: Where x=y and y=x and x<>y */
    tempb as
    (
      select distinct A_X,A_Y from
        (
            select distinct a.x as A_X,a.y as A_Y, b.y as B_Y,b.x as B_X
            from functions a inner join functions b
            on a.x=b.y and a.y=b.x
        ) 
       where A_X<B_X
    )
    select * from 
    (
        select * from tempa
        union 
        select * from tempb
    )
     order by 1;
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    • 这里我考虑了 2 种情况: 情况 1:如果 X 和 Y 相等,它们必须在表中至少有 2 个条目,并且我在表 tempa 中考虑了这些情况。情况 2:如果 x1=y2 且 y1=x2,例如:1,2 和 2,1,那么我们只需要考虑 1,2 并排除 2,1。在表 tempb 中考虑了这些情况。最后,我将案例 1 和案例 2 合并,并按 x 对结果进行排序。我希望这个解释能让你更容易理解。
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多