2010-11-02 27 views
1

我需要幫助。如何在sql中獲取缺少的值?

我有一個與其他兩個表t1和t3有關的sql表t2。

T2具有字段:

idFromt3 idFromt1 Value 

1  14  text1 
2  14  text2 
1  44  text1 
2  44  text2 
3  44  text3 

我在尋找值,其中ifFromt3丟失。 我想在這個例子中使用ifFromt3 = 3的值,因爲它不存在。

我這樣做就像這個例子,但它不能正常工作。

SELECT t3.idFromt3, t3.idFromt1 
FROM t3 
    INNER JOIN t2 
    ON t3.LanguageMessageCodeID <> t2.idFromt2 

這是3張表格。

CREATE TABLE [dbo].[t3](
    [t3ID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [varchar](50) NOT NULL, 
) 

CREATE TABLE [dbo].[t2](
    [t2ID] [int] IDENTITY(1,1) NOT NULL, 
    [t3ID] [int] NOT NULL, 
    [t1ID] [int] NOT NULL, 
) 


CREATE TABLE [dbo].[t1](
    [t1ID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [varchar](50) NOT NULL, 
) 

UPDATE:

表數據: http://www.2shared.com/photo/40yY6FC-/Untitled.html

我需要一個查詢,返回表LangugageMes​​sageCodes所有丟失的組合。

在這種情況下:

LanguageMessageCodeID LanguageID 
3      14 
1      47 
2      47 
3      47 

請。幫幫我。

關於。

+0

您的第二列讀取't3.idFromt1',但是從t3讀取?它是否正確?或錯字? 't1'在哪裏加入? – 2010-11-02 11:01:07

回答

2
SELECT * 
FROM t2 
WHERE t2.idFromt3 NOT IN 
     (
     SELECT LanguageMessageCodeID 
     FROM t3 
     ) 

SELECT * 
FROM t2 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM t3 
     WHERE t3.LanguageMessageCodeID = t2.id 
     ) 

SELECT t2.* 
FROM t2 
LEFT JOIN 
     t3 
ON  t3.LanguageMessageCodeID = t2.id 
WHERE t3.LanguageMessageCodeID IS NULL 

更新:

試試這個:

SET NOCOUNT ON 
DECLARE @t1 TABLE (id INT NOT NULL PRIMARY KEY) 
DECLARE @t2 TABLE (t3id INT NOT NULL, t1id INT NOT NULL, PRIMARY KEY (t1id, t3id)) 
DECLARE @t3 TABLE (id INT NOT NULL) 

INSERT 
INTO @t1 
VALUES (14) 
INSERT 
INTO @t1 
VALUES (44) 

INSERT 
INTO @t2 
VALUES (1, 14) 
INSERT 
INTO @t2 
VALUES (2, 14) 
INSERT 
INTO @t2 
VALUES (1, 44) 
INSERT 
INTO @t2 
VALUES (2, 44) 
INSERT 
INTO @t2 
VALUES (3, 44) 

INSERT 
INTO @t3 
VALUES (1) 
INSERT 
INTO @t3 
VALUES (2) 
INSERT 
INTO @t3 
VALUES (3) 

SELECT t1.id, t3.id 
FROM @t1 t1 
CROSS JOIN 
     @t3 t3 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM @t2 t2 
     WHERE t2.t1id = t1.id 
       AND t2.t3id = t3.id 
     ) 
+0

它不起作用:( – eman 2010-11-02 11:46:15

+0

@eman:它給出了什麼錯誤信息? – Quassnoi 2010-11-02 11:47:07

+0

有沒有錯誤,但結果是錯誤的 – eman 2010-11-02 12:45:41

2

如果您想查找連接表中存在不存在的行,則需要使用LEFT OUTER JOIN

外連接將導致左表的所有行,無論是否存在右側的匹配。

爲了按那些不存在的過濾,可以爲012表的NULL值添加WHERE子句檢查。

SELECT t3.idFromt3, t3.idFromt1 
FROM t3 
    LEFT OUTER JOIN t2 
    ON t3.LanguageMessageCodeID <> t2.idFromt2 
WHERE t2.idFromts IS NULL