我想知道是否有可能在没有使用类似的东西的连接的情况下写这个 IN关键字,如果是这样,它会比我在下面写的更好。
SELECT DISTINCT vendor_name
FROM vendors JOIN invoices
ON vendors.vendor_id = invoices.vendor_id
ORDER BY vendor_name;
答案 0 :(得分:1)
以下查询可能是运行查询的更有效方式:
SELECT vendor_name
FROM vendors v
WHERE EXISTS (SELECT 1
FROM invoices i
WHERE v.vendor_id = i.vendor_id
);
为了获得最佳效果,您需要invoices(vendor_id)
和vendors(vendor_name, vendor_id)
上的索引。
首先,我更喜欢join
版本,因为我认为它更清晰。但是,这有以下优点:
select distinct
(假设供应商名称已经是唯一的)。这节省了运行distinct的聚合。vendors
上的索引按顺序处理供应商ID。exists
通常具有比in
更好的性能特征。注意,当invoices
表远小于vendors
时,这将没有最佳性能。
答案 1 :(得分:0)
虽然联接是首选方法,但将其转换为IN
将如下所示:
SELECT DISTINCT vendor_name
FROM vendors
WHERE vendor_id IN (select vendor_id from invoices)
ORDER BY vendor_name;
答案 2 :(得分:0)
SELECT DISTINCT vendor_name
FROM vendors, invoices
WHERE vendors.vendor_id = invoices.vendor_id
ORDER BY vendor_name;