【问题标题】:T-SQL: logical unique table rows in tableT-SQL:表中的逻辑唯一表行
【发布时间】:2013-04-25 07:56:10
【问题描述】:

我有一个简单的表格,其中包含有关元素之间双向链接的信息。表格如下所示:

link_id | link_side_a_element_id | link_side_b_element_id
---------------------------------------------------------
      1 |                    100 |                    200
      2 |                    200 |                    100
      3 |                    300 |                    400
      4 |                    400 |                    300

我想要的只是选择元素之间的唯一链接,无论哪个元素是 sideA 或 sideB。例如,100 到 200 之间的链接与 200 到 100 之间的链接相同,查询应该只返回一条记录,例如:

link_side_a_element_id | link_side_b_element_id
-----------------------------------------------
                   100 |                    200
                   300 |                    400

这对我来说已经足够了。但是坚持写正确的选择DML......现在我用Java做,使用正确的hashCode()和equals()方法获取所有数据到Set。这目前对我有用,但想在 SQL Management Studio 中正确获取数据......如何实现这一点?

【问题讨论】:

    标签: sql sql-server tsql select unique


    【解决方案1】:

    只需选择两个项目应出现的 顺序(例如,始终首先列出最低/最早的),然后在其上运行 DISTINCT

    SELECT DISTINCT
       CASE WHEN link_side_a_element_id < link_side_b_element_id THEN link_side_a_element_id
            ELSE link_side_b_element_id END as a,
       CASE WHEN link_side_a_element_id < link_side_b_element_id THEN link_side_b_element_id
            ELSE link_side_a_element_id END as b
    FROM
        table
    

    【讨论】:

    • 第二种情况应该使用&gt;而不是&lt;
    • @a_horse_with_no_name - 不,这两个条件是相同,选择要输出的列是交换的。我发现以这种方式避免在交换中犯错误要容易得多。
    • 啊,对,我没看到。太糟糕了,SQL Server 不支持least()greatest() 函数,这使得这种表达式很多更容易阅读。
    • @Damien_The_Unbeliever 绝招!奇迹般有效!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多