使用'!='运算符加入

时间:2014-01-23 21:21:08

标签: sql database join

JOININNER JOIN条款通常与=运算符一起使用,如下所示:

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id

我注意到可以在JOIN子句中使用任何运算符。可以使用!=, >=, <=,等。

我想知道在JOIN子句中哪些实用程序可以使用另一个运算符。我认为使用ie >=, <=, >, <可能没有那么多实用性,但有人想象使用这些可能有用的任何例子吗? (我的意思是PRIMARY KEY

此外,任何人都可以告诉我下一个查询是否返回“两个表的行与另一个表没有任何关系”

SELECT * FROM table1 INNER JOIN table2 ON table1.id != table2.id

3 个答案:

答案 0 :(得分:1)

SELECT *
FROM 
   table1 

   INNER JOIN table2 
   ON Table1.id = Table2.id
   AND Table2.description != 'leave me alone!'

SELECT *
FROM 
   table1 

   INNER JOIN table2 
   ON Table1.id = Table2.id
   AND Table2.due_date <= GETDATE()

答案 1 :(得分:1)

使用=的联接被称为“equijoins”这些联接对于数据库引擎来说是最容易优化的。其他类型的连接称为“非等同连接”(在数据库中命名的人不是特别有创意;)。

是的,它们很有用。假设您有一个值列表。计算小于或等于每个数字的值的数量的一种方法是使用具有聚合的非等值连接:

select t1.number, count(*)
from t t1 join
     t t2
     on t2.number <= t1.number
group by t1.number;

当然,还有其他方法可以做到这一点。这是为了让您了解非等值的效用。

一种特殊类型的非等值连接使用特殊名称cross join。当您想要从两个表中获取所有行组合时,这些非常有用 - 在某些情况下非常有用。

您的查询:

SELECT *
FROM table1 INNER JOIN
     table2
     ON table1.id != table2.id;

可能会被更好地理解为:

SELECT *
FROM table1 CROSS JOIN
     table2
WHERE table1.id <> table2.id;

这些返回完全相同的东西。但第二个强调你得到t1t2的所有行组合,除了那两个id s相同的行(在某种意义上,“对角线”) )。

答案 2 :(得分:1)

< 加入的一个典型示例是将所有值对都放在一列中,其中两个项目彼此不同。

有关示例,请参阅http://www.sqlfiddle.com/#!2/4ed2a/3

create table numbers(val int);

insert into numbers values(1);
insert into numbers values(2);
insert into numbers values(3);
insert into numbers values(4);

和声明:

select m.val as first, n.val as second
  from numbers m join numbers n on m.val < n.val

提供数字1到4的六种组合,其中两个数字都不同:

1 2
1 3
1 4
2 3
2 4
3 4

在联接中使用<=的示例将是一个运行总和:基于同一个表,如果我想查看记录的实际值,以及直到当前行的所有记录的总和,我可以使用以下语句:

select m.val, sum(n.val) as running_sum
 from numbers m join numbers n on n.val <= m.val
group by m.val
order by m.val

返回

1  1
2  3
3  6
4 10

在实际应用程序中,您通常在表中至少有两列,如id和sales值,您要为其显示实际记录值和运行总计。但是为了简单起见,我仍然使用相同的桌面模型。