如何在sql中获取缺少的值?

问题描述:

我需要帮助。如何在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

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

如果您想查找连接表中存在不存在的行,则需要使用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