2010-03-05 61 views
4

可能之前已經詢問過,但我找不到答案。獲取兩個字段值的唯一組合

表數據有兩列:

Source Dest 
1   2 
1   2 
2   1 
3   1 

我試圖想出一個MS Access 2003中的SQL查詢將返回:

1  2 
3  1 

但都無濟於事。請幫忙!

更新:確切地說,我試圖排除2,1,因爲1,2已包括在內。我只需要序列無關緊要的獨特組合。

+2

2 - 1也是唯一的,是否應該排除? –

+1

爲什麼2,1會被遺漏?它包含1,2包含嗎?那麼你怎麼決定使用1,2還是2,1? –

+0

2,1應該被排除,這就是問題 –

回答

2

對於微軟的Access,你可以嘗試

SELECT DISTINCT 
     * 
FROM Table1 tM 
WHERE NOT EXISTS(SELECT 1 FROM Table1 t WHERE tM.Source = t.Dest AND tM.Dest = t.Source AND tm.Source > t.Source) 

編輯:

實例與表中的數據,這是相同的......

SELECT DISTINCT 
     * 
FROM Data tM 
WHERE NOT EXISTS(SELECT 1 FROM Data t WHERE tM.Source = t.Dest AND tM.Dest = t.Source AND tm.Source > t.Source) 

或(尼斯和訪問格式化...

SELECT DISTINCT * 
FROM Data AS tM 
WHERE (((Exists (SELECT 1 FROM Data t WHERE tM.Source = t.Dest AND tM.Dest = t.Source AND tm.Source > t.Source))=False)); 
+0

第一次修改返回1,2; 1,2; 3,1這顯然是不正確的。 –

+0

我只是在MS Access上運行它,它返回1,2 3,1。你測試過了嗎?你是否加入了** DISTINCT **? –

+0

Astander,一對一複製它,只是將數據替換爲Table1 –

0

使用此查詢:

SELECT distinct * from tabval ; 
+0

這不是要求的... –

0

消除重複「選擇不同的」比更容易「分組依據」:

select distinct source,dest from data; 

編輯:我現在是你想得見獨特的組合(不包括1,2和2,1)。你可以這樣做:

select distinct source,dest from data 
minus 
select dest,source from data where source < dest 

「減號」翻轉訂單,並消除您已經有匹配的情況; 「其中源< dest」不讓你同時刪除(1,2)和(2,1)

+0

將返回1,2; 2,1; 3; 1 - 2,1應排除 –

+0

你不能在MS Access中使用減號,因此問題:) –

0

你的問題被錯誤地提出。 「獨特的組合」就是你的所有記錄。但我認爲你的意思是每個來源一行。所以它是:

SELECT * 
FROM tab t1 
WHERE t1.Dest IN 
(
    SELECT TOP 1 DISTINCT t2.Dest 
    FROM tab t2 
    WHERE t1.Source = t2.Source 
) 
+0

在MS Access 2003中不起作用,抱怨IN子句。順便說一下,以防萬一在問題中有一個期望的輸出樣本來消除可能的不明確性。 –

+0

此查詢將返回所需的行,但我不知道如何在ms訪問sql中寫入。 – Andrey

+0

Andrey,道歉,我在問題中澄清它必須是Access 2003. –

0
SELECT t1.* FROM 
(SELECT 
    LEAST(Source, Dest) AS min_val, 
    GREATEST(Source, Dest) AS max_val 
FROM table_name) AS t1 
GROUP BY t1.min_val, t1.max_val 

將在MySQL返回

1, 2 
1, 3