加入并不是我的专栏

时间:2017-03-20 20:41:57

标签: sql-server sql-server-2008

我使用此代码连接两个表:

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。我希望的结果是:

id      barcode

1       10001
2       10009

4 个答案:

答案 0 :(得分:1)

您可以使用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;

答案 1 :(得分:0)

表中的行未订购,因此没有第一个,第二个或最后一个记录。您必须指定所需的记录或条形码。以下是每个ID最小条形码编号的示例:

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

答案 2 :(得分: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

答案 3 :(得分:0)

请勿使用SELECT DISTINCT - 它等同于GROUP BY *,这不是您想要的。

相反,您需要缩小barcodes以使其与1:1保持inventory的关系,除非现在它与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