没有使用连接的任何方式来写这个

时间:2014-06-06 01:18:26

标签: sql oracle

我想知道是否有可能在没有使用类似的东西的连接的情况下写这个 IN关键字,如果是这样,它会比我在下面写的更好。

SELECT DISTINCT vendor_name
FROM vendors JOIN invoices
    ON vendors.vendor_id = invoices.vendor_id
ORDER BY vendor_name;

3 个答案:

答案 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版本,因为我认为它更清晰。但是,这有以下优点:

  1. 它消除了select distinct(假设供应商名称已经是唯一的)。这节省了运行distinct的聚合。
  2. 如果没有聚合,查询可以使用vendors上的索引按顺序处理供应商ID。
  3. exists通常具有比in更好的性能特征。
  4. 注意,当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;