條款

2009-09-25 175 views
12

使用的元組在SQL定數據庫是這樣的:條款

BEGIN TRANSACTION; 
CREATE TABLE aTable (
a STRING, 
b STRING); 
INSERT INTO aTable VALUES('one','two'); 
INSERT INTO aTable VALUES('one','three'); 
CREATE TABLE anotherTable (
a STRING, 
b STRING); 
INSERT INTO anotherTable VALUES('one','three'); 
INSERT INTO anotherTable VALUES('two','three'); 
COMMIT; 

我想一起做的

SELECT a,b FROM aTable 
WHERE (aTable.a,aTable.b) IN 
(SELECT anotherTable.a,anotherTable.b FROM anotherTable); 

得到的答案「一」線的東西,「三化」 ,但我越來越「近」,「:語法錯誤」

這是可能的任何味道的SQL? (我正在使用sqlite)

我是否犯了嚴重的概念錯誤?或者是什麼?

回答

18

你的代碼的工作,如果你在PostgreSQL中或Oracle做到這一點。在MS SQL,它不支持

使用本:

SELECT a,b FROM aTable 
WHERE 
-- (aTable.a,aTable.b) IN -- leave this commented, it makes the intent more clear 
EXISTS 
(
    SELECT anotherTable.a,anotherTable.b -- do not remove this too, perfectly fine for self-documenting code, i.e.. tuple presence testing 
    FROM anotherTable 
    WHERE anotherTable.a = aTable.a AND anotherTable.b = aTable.b 
); 

[編輯]意圖

SAN的說明:

SELECT a,b FROM aTable 
WHERE  
EXISTS 
(
    SELECT * 
    FROM anotherTable 
    WHERE anotherTable.a = aTable.a AND anotherTable.b = aTable.b 
); 

它有點瘸,比一個更十年來,MS SQL仍然沒有對元組的一流支持。 IN元組構造比其類似的EXISTS構造更可讀。順便說一句,JOIN也可以工作(tster的代碼),但是如果你需要更靈活和麪向未來的東西,可以使用EXISTS。

[編輯]的SQLite

講,我與它最近涉足。是啊,元組不起作用

+0

在10分鐘內確定的答案! 在sqlite中不起作用:-( 投票並接受 – 2009-09-25 01:32:52

+0

即使它在sqlite中工作,我也會建議不要這樣做,這一定會混淆未來的代碼維護者(注意:你是未來的維護者,所以你會對此感到困惑) – tster 2009-09-25 01:37:52

+4

@tster - 我沒有看到任何混淆的來源 – 2009-11-01 23:37:20

2

你可以使用一個連接:

SELECT aTable.a, aTable.b FROM aTable 
JOIN anotherTable ON aTable.a = anotherTable.a AND aTable.b = anotherTable.b 
+0

這有效。加上答案在5分鐘內顯示! 仍然有興趣知道我的建議代碼是否可能/絕望誤解/不管? – 2009-09-25 01:24:38

+0

是的,你正試圖用你理解的方式來寫,但是這個問題可以更自然地用SQL理論的基礎 - 集合論來解決。 SQL的一個非常常見的用法是加入兩個表來獲得它們的交集,這就是你要做的。 – RedFilter 2009-09-25 01:31:03

+0

@OrbMan:IN更直觀;有時候加入,太過於計算機科學。這只是一個從語言中獲得更多一流構造以便更容易完成的事情(考慮C#的屬性vs Java setter/getter)。如果IN適用於單值,那麼如果您使用的RDBMS也適用於配對值(元組) – 2009-09-25 01:49:03

1

另一種方法是使用串聯,使您的2元組爲單場:

SELECT a,b FROM aTable 
WHERE (aTable.a||'-'||aTable.b) IN 
(SELECT (anotherTable.a || '-' || anotherTable.b FROM anotherTable); 

...要知道,壞的事情都可能發生,如果一個或b包含分隔符' - '

+1

這個解決方案還有一個缺點:查詢優化器不能推斷這樣的表達式,所以不能優化查詢。 – iuzuz 2018-01-23 14:59:57