这个查询如何工作?

时间:2016-07-26 04:48:57

标签: sql sql-server

Name

+-------+
| Name  |
+-------+
|  red  |
|  black|
| white |
| green |
| orange|
+--------+

输出将返回该对(不允许排列,例如黑色,红色和红色,黑色)

我的SQL Server查询:

select  
    A, B 
from
    (select 
         A.colorname A, B.colorname B 
     from 
         colors A  
     join 
         colors B on A.colorname <> B.colorname
                  and A.colorname < B.colorname) C

我的问题是:这个查询是如何工作的?

我没有得到A.colorname < B.colorname在这里工作的方式......事实上,删除A.colorname<>B.colorname会返回相同的结果。

2 个答案:

答案 0 :(得分:1)

A.colorname < B.colorname 为您提供按字母顺序排列的结果。两种颜色的排列仅被挑选一次。对于例如黑色和红色有两种排列:

  1. 黑,红
  2. 红色,黑色。
  3. 仅挑选第一个,因为颜色名称按字母顺序排列。

答案 1 :(得分:1)

表格中的值都不同,并且可以按字母顺序排序。

通过将表与<进行比较,它总是通过将左侧的行连接到右侧具有“更大”值的行来提供结果行。

+-------+   +-------+
| Name  |   | Name  |   
+-------+   +-------+
| red   |   | red   |
+-------+   +-------+
| black |   | black |
+-------+   +-------+
| white |   | white |
+-------+   +-------+
| green |   | green |
+-------+   +-------+
| orange|   | orange|
+-------+   +-------+

从LEFT表的第一行开始,JOIN的结果是

red - white

然后在第二行,JOIN的结果是

black - red
black - white
black - green
black - orange

在第三行,因为没有大于white会产生空结果。

您可以使用相同的逻辑来计算剩余的结果。

结果,它将显示所有对而没有排列。

注意A.colorname<>B.colorname不是必需的,因为它只是A.colorname < B.colorname的一个子集。