2014-01-23 43 views
1

JOININNER JOIN條款通常與=運營商使用,像這樣:JOIN與「!=」操作

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

我注意到,有可能使用上JOIN條款的任何操作。有可能使用!=, >=, <=,

我想知道在JOIN子句中有什麼工具可以使用另一個運算符。我認爲使用>=, <=, >, <可能沒有太大的用處,但有人想象使用這些有用的任何示例嗎? (我的意思PRIMARY KEY

而且,誰能告訴我,如果一個查詢返回「他們擁有與其他沒有任何關係兩個表中的行」?

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

請做一些實驗... :-)你會得到一些非常快速的答案,這種方式... – Chains

回答

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表和一個銷售值要顯示實際記錄值,運行總數。但爲了簡單起見,我使用了相同的表格模型。

+0

非常好你的最後一個例子。我沒有注意到這種使用,它非常有用!謝謝! – carexcer

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

加入使用該=被稱爲 「等值連接」 這些連接是最簡單的數據庫引擎優化。其他類型的連接被稱爲「非平等連接」(在數據庫中命名事物的人不是特別有創意的人)。

是的,它們很有用。假設你有一個值列表。一種方法來計算值的數量小於或等於每個數字是使用非等值連接帶聚集:

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

有,當然還有其他方法可以做到這一點。這是爲了讓你瞭解非平行黴素的效用。

一種特殊類型的非equijoin採用特殊名稱cross join。當你想從兩個表中獲得行的所有組合時,這些都很有用 - 在某些情況下非常有用。

您的疑問:

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

可能會更好理解爲:

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

這回完全一樣的東西。但是第二個強調的是,除了兩個id是相同的(從某種意義上說,「對角線」),您將獲得t1t2的所有行的組合。