我使用此代码连接两个表:
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
答案 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本身并不太关心排序,这就是为什么没有FIRST
或LAST
聚合函数(尽管有MIN
和MAX
) - 在SQL数据中没有排序的概念,直到您使用ORDER BY
明确指定它(或使用带有聚合的OVER
)。
对于快速的内容,只需使用MIN
或MAX
:
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