2017-08-30 70 views
0

有沒有一種方法來查詢兩列的組合上的不同?假設我有下表,其中LinkedIds是來自同一個表的外鍵,下表將這兩者連接在一起。 我需要的是一種查詢表格以獲得不同條目的方式,以便在查詢圖1時獲得圖2中的結果。2列上的SQL不同

無論我將哪一行取回,只是返回一個。無論如何,用普通的SQL來實現這一點?

圖1.

+----+-------------------+-------------------+ 
| Id | Table1_LinkedId_1 | Table1_LinkedId_2 | 
+----+-------------------+-------------------+ 
| 1 | 15    | 48    | 
| 2 | 48    | 15    | 
| 3 | 1     | NULL    | 
| 4 | NULL    | 5     | 
| 5 | 12    | 51    | 
+----+-------------------+-------------------+ 

圖2.

+----+-------------------+-------------------+ 
| Id | Table1_LinkedId_1 | Table1_LinkedId_2 | 
+----+-------------------+-------------------+ 
| 1 | 15    | 48    | 
| 3 | 1     | NULL    | 
| 4 | NULL    | 5     | 
| 5 | 12    | 51    | 
+----+-------------------+-------------------+ 

回答

2

您可以創建表

select 
    id, 
    case when Table1_LinkedId_1 < Table1_LinkedId_2 then Table1_LinkedId_1 else Table1_LinkedId_2 end link1, 
    case when Table1_LinkedId_1 < Table1_LinkedId_2 then Table1_LinkedId_2 else Table1_LinkedId_1 end link2 
from links 

那麼你可以使用這個有序的版本,以重複數據刪除

select 
    min(id) id, 
    link1, 
    link2 
from 
(
     select 
     id, 
     case when Table1_LinkedId_1 < Table1_LinkedId_2 then Table1_LinkedId_1 else Table1_LinkedId_2 end link1, 
     case when Table1_LinkedId_1 < Table1_LinkedId_2 then Table1_LinkedId_2 else Table1_LinkedId_1 end link2 
     from links 
) x 
group by link1, link2 
+1

哈哈幾乎相同的答案,秒的差異 – jperelli

1

你可以嘗試沿着這行的東西(未測試)

SELECT 
    * 
FROM 
    (
    SELECT 
     CASE 
      WHEN Table1_LinkedId_1 >= Table1_LinkedId_2 THEN Table1_LinkedId_1 
      ELSE Table1_LinkedId_2 
     END AS Max, 
     CASE 
     WHEN Table1_LinkedId_1 <= Table1_LinkedId_2 THEN Table1_LinkedId_1 
     ELSE Table1_LinkedId_2 
     END AS Min 
    FROM 
     Figure1 
) as Inner 
GROUP BY 
    Max, 
    Min 
2

這是一個選項...

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData; 

CREATE TABLE #TestData (
    Id INT NOT NULL PRIMARY KEY, 
    Link1 INT NULL, 
    Link2 INT NULL 
    ); 
INSERT #TestData (Id, Link1, Link2) VALUES 
    (1, 15 , 48 ), 
    (2, 48 , 15 ), 
    (3, 1 , NULL), 
    (4, NULL, 5 ), 
    (5, 12 , 51 ); 

-- ================================================================= 

WITH 
    cte AS (
     SELECT 
      td.Id, td.Link1, td.Link2, 
      RN = ROW_NUMBER() OVER (PARTITION BY IIF(td.Link1 <= td.Link2, td.Link1, td.Link2), IIF(td.Link1 > td.Link2, td.Link2, td.Link1) ORDER BY (SELECT NULL)) 
     FROM 
      #TestData td 
     ) 
SELECT 
    c.Id, c.Link1, c.Link2 
FROM 
    cte c 
WHERE 
    c.RN = 1; 

結果...

Id   Link1  Link2 
----------- ----------- ----------- 
3   1   NULL 
4   NULL  5 
5   12   51 
1   15   48