2012-11-09 110 views
1

我有兩個表。 tlt2。每個表具有列:ID,nameID是一個PK和自動增量。兩張桌子沒有互相連接。 t2.namet1.name的子集,但是在name的字符串開始處添加www.之後。 例如:如何從一個表中存在另一個表中選擇記錄

`t1`.`name`= ggg 
`t2`.`name`= www.ggg 

我所試圖做的是:選擇在哪裏t1.namet2沒有完全插入的記錄。所以我寫了下面的查詢:

select concat('www.',name) 
from db.t1 
LEFT JOIN db.t2 
ON t2.name = t1.name 
WHERE NOT EXISTS (select name from db.t2); 

但是,我得到0的結果。我確信在t1中有記錄,但在t2中沒有記錄。我如何在t1中選擇所有不在t2中的名稱?

+1

'WHERE NOT EXISTS(SELECT名字來自db.t2)'會導致查詢返回零或取決於如果表t2包含所有結果因爲沒有條件,所以沒有行。 – gapple

回答

1
select concat('www.',name) 
from db.t1 
LEFT JOIN db.t2 ON t2.name = concat('www.', t1.name) 
WHERE db.t2.name IS NULL 
+0

這返回了t1中的所有記錄。 – user1810868

+0

編輯我的答案。請再試一次。 –

0
SELECT CONCAT('www.', tbl1.name) 
FROM db.t1 AS tbl1 
WHERE NOT EXISTS (
    SELECT 1 
    FROM db.t2 AT tbl2 
    WHERE CONCAT('www.', tbl1.`name`) = tbl2.`name` 
) 
+0

1)我無法弄清楚你的第二選擇中的「select 1」是什麼意思。 2)當我認爲是t2.name它沒有工作。它返回t1中的所有記錄。 – user1810868

+0

在存在測試中,所有重要的是存在或不存在結果集。通過返回值1而不是記錄,可以減少要完成的工作量。 – GunnerL3510

+0

不確定爲什麼這會返回t1中的所有記錄。它明確指出只有在t2中沒有記錄的情況下才從t1中返回那些記錄,即在添加www之後的t1中的名稱。到它的開頭,在t2中匹配一個名字。在大多數情況下,EXISTS測試比執行JOIN和測試NULL更高效。只有測試才能確認。 – GunnerL3510

0

這應該這樣做:

select t.name FROM 
(
select concat('www.',t1.name) AS name 
from t1 
) t 
LEFT JOIN t2 
ON t2.name = t.name 
WHERE t2.name IS NULL 
相關問題