使用不相等的连接

时间:2009-03-27 15:03:53

标签: sql join

在我写过的所有成千上万的查询中,我可以一方面指望我使用非等值连接的次数。 e.g:

SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.date > tbl2.date

大多数这些实例可能使用其他方法更好地解决了。您遇到过的非等值连接是否有任何好的/聪明的现实世界用途?

7 个答案:

答案 0 :(得分:2)

Bitmasks浮现在脑海中。在我的一个工作中,我们对存储在数据库中的“对象”(通常对应于代码中的表单或类)上的特定用户或组具有权限。我们通常会为每个特定权限分配一个行或列(读取,写入,读取其他内容,写入其他内容等),而不是为每个特定权限包含行或列。然后,我们可以使用按位运算符连接以获取具有特定权限的对象。

答案 1 :(得分:1)

检查重叠怎么样?

select ...
from   employee_assignments ea1
,      employee_assignments ea2
where  ea1.emp_id = ea2.emp_id
and    ea1.end_date >= ea2.start_date
and    ea1.start_date <= ea1.start_date

答案 2 :(得分:1)

date_time字段中的全天inetervals:

date_time_field&gt; = begin_date和date_time_field&lt; end_date_plus_1

答案 3 :(得分:1)

刚刚在MCTS 70-433(SQL Server 2008数据库开发)培训套件书中找到了另一个有趣的不等连接用法。逐字逐句。

通过将派生表与不等连接组合,您可以计算各种累积聚合。以下查询返回每个销售人员的正在运行的订单总数(我的注释 - 参考无处不在的AdventureWorks示例数据库):

select
    SH3.SalesPersonID,
    SH3.OrderDate,
    SH3.DailyTotal,
    SUM(SH4.DailyTotal) RunningTotal
from
    (select SH1.SalesPersonID, SH1.OrderDate, SUM(SH1.TotalDue) DailyTotal
    from Sales.SalesOrderHeader SH1
    where SH1.SalesPersonID IS NOT NULL
    group by SH1.SalesPersonID, SH1.OrderDate) SH3
join
    (select SH1.SalesPersonID, SH1.OrderDate, SUM(SH1.TotalDue) DailyTotal
    from Sales.SalesOrderHeader SH1
    where SH1.SalesPersonID IS NOT NULL
    group by SH1.SalesPersonID, SH1.OrderDate) SH4
on SH3.SalesPersonID = SH4.SalesPersonID AND SH3.OrderDate >= SH4.OrderDate
group by SH3.SalesPersonID, SH3.OrderDate, SH3.DailyTotal
order by SH3.SalesPersonID, SH3.OrderDate

派生表用于组合在一天内拥有多个订单的销售人员的所有订单。 SalesPersonID上的联接可确保您仅为单个销售人员累积行。不等连接允许聚合仅考虑销售人员的行,其中订单日期早于结果集中当前正在考虑的订单日期。

在这个特定的例子中,不等连接在SH4的每日总列上创建一个“滑动窗口”类型的总和。

答案 4 :(得分:0)

Dublicates;

SELECT
  *
FROM
  table a, (
    SELECT
      id,
      min(rowid)
    FROM 
      table
    GROUP BY
      id
  ) b
WHERE
  a.id = b.id
  and a.rowid > b.rowid;

答案 5 :(得分:0)

如果您想要向客户提供所有产品,并且不想向他们提供他们已有的产品:

SELECT
     C.customer_id,
     P.product_id
FROM
     Customers C
INNER JOIN Products P ON
     P.product_id NOT IN
          (
               SELECT
                    O.product_id
               FROM
                    Orders O
               WHERE
                    O.customer_id = C.customer_id
          )

最常见的是,当我使用非等值时,这是因为我正在对数据进行某种手动修复。例如,业务部门告诉我,应该为用户表中的某个人提供他们尚未拥有的所有访问角色等。

答案 6 :(得分:0)

如果您想对两个不相关的表进行脏连接,可以使用&lt;&gt;加入。

例如,您可以拥有Product表和Customer表。假设,如果您想显示每个客户的每个产品列表,您可以做这样的事情:

SELECT *   来自产品p     在p.SKU&lt;&gt;上加入客户c c.SSN

它可能很有用。但要小心,因为它可能会产生巨大的结果集。