SQL查找表中缺少的语言项
我有一个表,它缺少某些特定语言的条目。如何获得缺少外文翻译文本(lang 2)的所有英文文本(表中lang 1)列表 我的桌子如下SQL查找表中缺少的语言项,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表,它缺少某些特定语言的条目。如何获得缺少外文翻译文本(lang 2)的所有英文文本(表中lang 1)列表 我的桌子如下 PageName | LanguageNo | TranslationName | TranslationText | main | 1 | SomeName | some english text | main | 2 | SomeName | some foreign text
PageName | LanguageNo | TranslationName | TranslationText |
main | 1 | SomeName | some english text |
main | 2 | SomeName | some foreign text |
main | 1 | SomeName2 | some english 2 |
other | 1 | SomeName3 | some english 3 |
other | 2 | SomeName3 | some foreign 3 |
例如,使用上表数据,只应返回以下内容:
main | 1 | SomeName2 | some english 2 |
如何编写SQL语句来实现这一点
谢谢有几种方法,但这里有一种使用
的方法不存在
:
select t.*
from mytable t
where t.LanguageNo = 1 and
not exists (select 1
from mytable t2
where t2.pagename = t.pagename and
t2.translationname = t.translationname and
t2.LanguageNo = 2
);
是一个SQL小提琴。有几种方法,但这里有一种使用
的方法不存在:
select t.*
from mytable t
where t.LanguageNo = 1 and
not exists (select 1
from mytable t2
where t2.pagename = t.pagename and
t2.translationname = t.translationname and
t2.LanguageNo = 2
);
是SQL小提琴。您可以尝试以下操作:
-- Create demo data
CREATE TABLE #translation(pageName nvarchar(10), LanguageNo int, TranslationName nvarchar(25), TranslationText nvarchar(50))
INSERT INTO #translation(pageName, LanguageNo, TranslationName, TranslationText)
VALUES ('main',1,'SomeName','some english text'),
('main',2,'SomeName','some foreign text'),
('main',1,'SomeName2','some english 2'),
('other',1,'SomeName3','some english 3'),
('other',2,'SomeName3','some foreign 3')
--,('other',3,'SomeName3','some foreign 3') -- uncomment for language3 demo
-- your work:
SELECT availTrans.*
FROM #translation t
-- get all needed combinations
RIGHT JOIN(
SELECT DISTINCT t.pageName, t.TranslationName, langs.LanguageNo
FROM #translation as t
CROSS JOIN (SELECT DISTINCT LanguageNo FROM #translation) as langs
) as availTrans
ON t.pageName = availTrans.pageName
AND t.TranslationName = availTrans.TranslationName
AND t.LanguageNo = availTrans.LanguageNo
WHERE t.pageName IS NULL
-- Cleanup
DROP TABLE #translation
给定输入:
pageName LanguageNo TranslationName TranslationText
---------- ----------- ------------------------- ---------------------
main 1 SomeName some english text
main 2 SomeName some foreign text
main 1 SomeName2 some english 2
other 1 SomeName3 some english 3
other 2 SomeName3 some foreign 3
产生这个结果的原因是:
pageName TranslationName LanguageNo
---------- ------------------------- -----------
main SomeName2 2
您可以尝试以下操作:
-- Create demo data
CREATE TABLE #translation(pageName nvarchar(10), LanguageNo int, TranslationName nvarchar(25), TranslationText nvarchar(50))
INSERT INTO #translation(pageName, LanguageNo, TranslationName, TranslationText)
VALUES ('main',1,'SomeName','some english text'),
('main',2,'SomeName','some foreign text'),
('main',1,'SomeName2','some english 2'),
('other',1,'SomeName3','some english 3'),
('other',2,'SomeName3','some foreign 3')
--,('other',3,'SomeName3','some foreign 3') -- uncomment for language3 demo
-- your work:
SELECT availTrans.*
FROM #translation t
-- get all needed combinations
RIGHT JOIN(
SELECT DISTINCT t.pageName, t.TranslationName, langs.LanguageNo
FROM #translation as t
CROSS JOIN (SELECT DISTINCT LanguageNo FROM #translation) as langs
) as availTrans
ON t.pageName = availTrans.pageName
AND t.TranslationName = availTrans.TranslationName
AND t.LanguageNo = availTrans.LanguageNo
WHERE t.pageName IS NULL
-- Cleanup
DROP TABLE #translation
给定输入:
pageName LanguageNo TranslationName TranslationText
---------- ----------- ------------------------- ---------------------
main 1 SomeName some english text
main 2 SomeName some foreign text
main 1 SomeName2 some english 2
other 1 SomeName3 some english 3
other 2 SomeName3 some foreign 3
产生这个结果的原因是:
pageName TranslationName LanguageNo
---------- ------------------------- -----------
main SomeName2 2
您也可以像这样将SUM
与OVER()一起使用
查询
;WITH CTE AS
(
SELECT pageName, LanguageNo, TranslationName, TranslationText,
SUM(CASE WHEN LanguageNo = 1 THEN 1 ELSE 0 END) OVER(PARTITION BY TranslationName) L1,
SUM(CASE WHEN LanguageNo = 2 THEN 1 ELSE 0 END) OVER(PARTITION BY TranslationName) L2
FROM #translation t
)
SELECT pageName, LanguageNo, TranslationName, TranslationText FROM CTE
WHERE L1 >=1 AND L2 = 0
输出
pageName LanguageNo TranslationName TranslationText
main 1 SomeName2 some english 2
您也可以像这样将SUM
与OVER()一起使用
查询
;WITH CTE AS
(
SELECT pageName, LanguageNo, TranslationName, TranslationText,
SUM(CASE WHEN LanguageNo = 1 THEN 1 ELSE 0 END) OVER(PARTITION BY TranslationName) L1,
SUM(CASE WHEN LanguageNo = 2 THEN 1 ELSE 0 END) OVER(PARTITION BY TranslationName) L2
FROM #translation t
)
SELECT pageName, LanguageNo, TranslationName, TranslationText FROM CTE
WHERE L1 >=1 AND L2 = 0
输出
pageName LanguageNo TranslationName TranslationText
main 1 SomeName2 some english 2
首先,您使用的是什么数据库管理系统??第二,自己尝试一下,如果不成功,请发布代码,以便人们可以对其进行调试。对不起,我的朋友,我正在MS SQL Management Studio上使用t-SQL。LanguageNo和TranslationName是键?该表使用PageName、LanguageNo和TranslationName作为复合键感谢您的评论。我在下面创建了一个示例代码-包括语句的输入/输出首先,您使用的是什么DBMS??第二,自己尝试一下,如果不成功,请发布代码,以便人们可以对其进行调试。对不起,我的朋友,我正在MS SQL Management Studio上使用t-SQL。LanguageNo和TranslationName是键?该表使用PageName、LanguageNo和TranslationName作为复合键感谢您的评论。我在下面创建了一个示例代码-包括语句的输入/输出。我很确定这不会产生预期的结果。我已经用给出的演示数据对它进行了测试。(你可以在我的答案中使用我的表结构来自己测试)@Ionic。非常感谢。答案是固定的。很高兴能帮助你。:-)我敢肯定这不会产生预期的结果。我已经用给出的演示数据对它进行了测试。(你可以在我的答案中使用我的表结构来自己测试)@Ionic。非常感谢。答案是固定的。很高兴能帮助你。:-)是的,但请注意,这只适用于两种语言。如果你有更多的语言需要修改:)是的,但要注意这只适用于两种语言。如果你有更多的语言,就需要修改:)起初我认为这太复杂了。然后我意识到,这是解决在有多种“外语”的情况下查找缺失翻译的唯一解决方案。添加一些LanguageNo=3的行来查看这一点。我在演示中添加了一个默认注释掉的语言3,因为OP没有提供它。是的,此解决方案适用于独立数量的语言。我敢肯定,有标记的答案不是解决方案。起初我认为这太复杂了。然后我意识到,这是解决在有多种“外语”的情况下查找缺失翻译的唯一解决方案。添加一些LanguageNo=3的行来查看这一点。我在演示中添加了一个默认注释掉的语言3,因为OP没有提供它。是的,此解决方案适用于独立数量的语言。我很确定标记的答案不是解决方案。这也会返回LanguageNo 1的所有内容。请参阅将t1.LanguageNo=1移动到其中,这也会返回LanguageNo 1的所有内容。请参阅将t1.LanguageNo=1移动到其中