2017-03-20 44 views
0

我使用這個代碼,使連接兩個表:加入犯規明顯我的專欄

SELECT 
    DISTINCT 
    i.id, 
    b.barcode 
FROM 
    inventory i 
    JOIN barcodes b ON b.id = i.id 
ORDER BY 
    i.id 

的問題是,我有很多條碼女巫用相同的ID連接。

這是我的輸出

id  barcode 

1  10001 
1  10002 
1  1003 
2  10009 
2  10101 

我希望有我的結果只有一個ID,並給了我臺的第一個條碼此id.My希望的結果是:

id  barcode 

1  10001 
2  10009 
+4

'和給我的第一Barcode',我們怎麼能知道哪一個是第一? – Lamak

+0

只是其中之一。我不在乎哪個將是我的代碼中的第一個原因,我將只使用id。 – Dim

+1

如果你只使用ID,那麼你爲什麼不'只選擇不同的id'而不是'id,barcode'? – aquinas

回答

0

您可以使用OUTER APPLY(也,你其實應該嘗試找出其條形碼你真的想):

SELECT i.id, 
     b.barcode 
FROM inventory i 
OUTER APPLY (SELECT TOP 1 * 
      FROM barcodes 
      WHERE id = i.id 
      ORDER BY barcode) b; 
0

在行一張表沒有排序,所以沒有第一個,第二個或最後一個記錄。你必須指定你想要的記錄或條形碼。下面是每個ID最小的條碼號的例子:

select id, min(barcode) 
from barcodes 
group by id; 
+0

順便說一句,過濾條件屬於where子句。因此,如果您想限制結果爲庫存中的ID,請添加'where id in(從庫存中選擇ID)'。 –

0
SELECT 
    i.id, 
    MIN(b.barcode) AS barcode 
FROM 
    inventory i 
    JOIN barcodes b ON b.id = i.id 
GROUP BY 
    i.id 
ORDER BY 
    i.id 
+4

這裏不需要'DISTINCT'關鍵字 – Lamak

+0

謝謝你的工作! – Dim

0

不要使用SELECT DISTINCT - 這相當於GROUP BY *,這不是你想要的。

相反,你需要減少barcodes下來,它有一個inventory關係1:1,但現在它是一個1:m關係。

作爲@Lamak在評論中提到,您還沒有指定哪個條碼應該用於給定的inventory行。 SQL本身並不是太在意排序,這就是爲什麼沒有FIRSTLAST聚合函數(雖然有MINMAX) - 在SQL數據沒有排序,直到你明確地ORDER BY指定它(或使用OVER與集料)的概念。

對於一些快速,只需使用MINMAX

SELECT 
    i.id, 
    MIN(b.barcode) AS barcode 
FROM 
    inventory i 
    INNER JOIN barcodes b ON b.id = i.id 
GROUP BY 
    i.id 
ORDER BY 
    i.id