如何使用sql选择其他相关表中不存在的记录?

时间:2016-03-30 11:46:16

标签: sql sql-server sql-server-2008

我有3张如下表

CREATE TABLE [dbo].[Languages](
    [Title] [nvarchar](50) NOT NULL,
    [Description] [nvarchar](200) NULL,
    [Id] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_Language] PRIMARY KEY NONCLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

CREATE TABLE [dbo].[LocalizationKeys](
    [Key] [nvarchar](500) NOT NULL,
    [Id] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_LocalizationKey] PRIMARY KEY NONCLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

CREATE TABLE [dbo].[LocalizationValues](
    [Value] [nvarchar](500) NOT NULL,
    [LanguageId] [uniqueidentifier] NULL,
    [LocalizationKeyId] [uniqueidentifier] NULL,
    [Id] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_LocalizationValue] PRIMARY KEY NONCLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

以下数据

Languages
Title   Description Id
en-US   English     C3B95465-0B0B-4B97-8C60-19D611F6A185
fi-FI   Finnish     7EDF3C04-3846-4B01-8045-315E26D05CD1

LocalizationKeys
Key Id
Save    A4B7E6DE-BBCE-40FB-8F0E-FE1034B2CAAF

LocalizationValues
Value   LanguageId                              LocalizationKeyId                       Id
Save    C3B95465-0B0B-4B97-8C60-19D611F6A185    A4B7E6DE-BBCE-40FB-8F0E-FE1034B2CAAF    6EB167F5-550B-435E-B6B3-35A02F21F630

现在,LocalizationValues table

缺少language fi-FI的{​​{1}}值
  

所以我想通过给出LocalId的LocalizationKeyId来找到它   该LanguageId缺少   我已经测试了此查询以进行记录 - 它无法正常工作

LocalizationKeyId='A4B7E6DE-BBCE-40FB-8F0E-FE1034B2CAAF'

2 个答案:

答案 0 :(得分:2)

您可以使用NOT EXISTS

SELECT [Key], Id
FROM LocalizationKeys AS lk
WHERE NOT EXISTS (SELECT 1
                  FROM Languages AS l
                  JOIN LocalizationValues AS lv ON l.Id = lv.LanguageId
                  WHERE l.Title = 'fi-FI' AND lv.LocalizationKeyId = lk.Id)

上述查询返回指定LocalizationKeyId缺少的LanguageId值。

Demo here

答案 1 :(得分:1)

尝试以下查询...

select * from Languages l 
inner join LocalizationKeys lk on 1=1
left join LocalizationValues lv on lv.LanguageId = l.id and lv.LocalizationKeyId =  lk.id

如果您发现LocalizationValues字段值为null,则其缺失