2014-01-16 93 views
20

我試過幾個小時,看了很多帖子,但我仍然無法弄清楚如何處理此請求:與另一列同一個ID,但不同的價值選擇行

我有一個表是這樣的:

+------+------+ 
|ARIDNR|LIEFNR| 
+------+------+ 
|1  |A  | 
+------+------+ 
|2  |A  | 
+------+------+ 
|3  |A  | 
+------+------+ 
|1  |B  | 
+------+------+ 
|2  |B  | 
+------+------+ 

我想選擇不同LIEFNR出現一次以上的ARIDNR。

輸出應該是這樣的:

+------+------+ 
|ARIDNR|LIEFNR| 
+------+------+ 
|1  |A  | 
+------+------+ 
|1  |B  | 
+------+------+ 
|2  |A  | 
+------+------+ 
|2  |B  | 
+------+------+ 

回答

26

這應該做到這一點:

SELECT * 
FROM YourTable 
WHERE ARIDNR IN (
    SELECT ARIDNR 
    FROM YourTable 
    GROUP BY ARIDNR 
    HAVING COUNT(*) > 1 
) 

的想法是使用內部查詢,以確定其有發生ARIDNR值記錄數據中有1+次,然後根據該組值從同一個表中獲取所有列。

+0

是的,但他只想要不同的LIEFNR – Segfault

+1

非常感謝。它看起來正是我正在尋找的東西。我會在幾分鐘內嘗試這個。 –

+0

@Segfault我認爲這是一個語言問題。他說*不同的'LIEFNR'*,並不是說它們實際上應該彼此不同,但可以說*我想看看你擁有的所有不同的東西*。 – Yuck

8

將同一張表加回自己。使用內部聯接,以便丟棄不匹配的行。在連接集中,將有表中具有不同LIEFNR的表中另一行中具有匹配的ARIDNR的行。允許那些ARIDNR出現在最終集合中。

SELECT * FROM YourTable WHERE ARIDNR IN (
    SELECT a.ARIDNR FROM YourTable a 
    JOIN YourTable b on b.ARIDNR = a.ARIDNR AND b.LIEFNR <> a.LIEFNR 
) 
+0

我知道該怎麼做,但我得到一個錯誤,說ARIDNR不是明確的柱狀圖 –

+0

啊,對,檢查我編輯過的查詢,你需要指定在子查詢中選擇哪個表。 – Segfault

+1

好的,這個工程。但是這選擇了一切,但不是我創建的示例。 –

8

請嘗試此操作。我檢查它和它的工作:

SELECT * 
FROM Table 
WHERE ARIDNR IN (
    SELECT ARIDNR 
    FROM Table 
    GROUP BY ARIDNR 
    HAVING COUNT(distinct LIEFNR) > 1 
) 
+0

我想這應該是公認的答案,因爲你真的在特定列中尋找差異,而不是在任何列 – Flugmango

0

只需通過

SELECT * 
FROM test 
WHERE ARIDNR IN 
    (SELECT ARIDNR FROM test 
    GROUP BY ARIDNR 
    HAVING COUNT(*) > 1) 
GROUP BY ARIDNR, LIEFNR; 

由於實現它。

0

使用此

select * from (
SELECT ARIDNR,LIEFNR,row_number() over 
    (partition by ARIDNR order by ARIDNR) as RowNum) a 
where a.RowNum >1 
0
$sql="SELECT * FROM TABLE_NAME WHERE item_id=".$item_id; 

$query=mysql_query($sql); 

while($myrow=mysql_fetch_array($query)) { 

echo print_r($myrow,1); 


} 
+1

嗨,請在代碼中添加一些解釋,因爲它有助於理解您的代碼。只有代碼答案是不被接受的。 –

0

這是一個老問題尚未我發現我還需要爲這個不時的解決方案。以前的答案都好,運作良好,我只是個人更喜歡使用CTE,例如:

DECLARE @T TABLE (ARIDNR INT, LIEFNR varchar(5)) --table variable for loading sample data 
INSERT INTO @T (ARIDNR, LIEFNR) VALUES (1,'A'),(2,'A'),(3,'A'),(1,'B'),(2,'B'); --add your sample data to it 
WITH duplicates AS --the CTE portion to find the duplicates 
(
    SELECT ARIDNR FROM @T GROUP BY ARIDNR HAVING COUNT(*) > 1 
) 
SELECT t.* FROM @T t --shows results from main table 
INNER JOIN duplicates d on t.ARIDNR = d.ARIDNR --where the main table can be joined to the duplicates CTE 

產生以下結果:

1 | A
1 |乙
2 | B
2 | A

相關問題