SQL查找表中缺少的语言项

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

我有一个表,它缺少某些特定语言的条目。如何获得缺少外文翻译文本(lang 2)的所有英文文本(表中lang 1)列表

我的桌子如下

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移动到其中