代码之家  ›  专栏  ›  技术社区  ›  FlatAssembler

查询在SQLite3中工作,但在Microsoft SQL Server中是一个语法错误

  •  0
  • FlatAssembler  · 技术社区  · 3 年前

    这个问题是:

    SELECT 100.*COUNT(DISTINCT names_of_numbers.language_name)/variables.value
        AS "Percentage of Indo-European languages in which the words for 2 and 10 start with the same letter."
        FROM (names_of_numbers as numbers1),names_of_numbers,languages,variables
        WHERE variables.variable_name='Number of Indo-European languages' and numbers1.language_name=names_of_numbers.language_name
             and names_of_numbers.language_name=languages.language_name and languages.language_family='Indo-European' and
             substr(numbers1.word,1,1)=substr(names_of_numbers.word,1,1) and numbers1.value=2 and names_of_numbers.value=10;
    

    Microsoft SQL server告诉我附近有语法错误 ) 在第三行。这是怎么回事?如何在标准SQL中进行该查询?

    1 回复  |  直到 3 年前
        1
  •  1
  •   forpas    3 年前

    之所以会出现这种错误,是因为这里有括号:

    (names_of_numbers as numbers1)
    

    移除它们。

    而且,你必须改变 SUBSTR() SUBSTRING() 这是SQL Server的等效函数,但对于您的情况来说 LEFT() 这也行。

    而且,由于您正在与 COUNT() 专栏 variables.value SQL Server不允许(SQLite允许)。
    而是使用返回 变量。价值 .

    最后,对所有表和表使用带别名的正确连接 ON 条款:

    SELECT 100.0 * COUNT(DISTINCT n2.language_name) / 
           (SELECT value FROM variables WHERE variable_name = 'Number of Indo-European languages') 
           AS [Percentage of Indo-European languages in which the words for 2 and 10 start with the same letter]
    FROM names_of_numbers n1
    INNER JOIN names_of_numbers n2 ON n2.language_name = n1.language_name
    INNER JOIN languages l ON l.language_name = n2.language_name
    WHERE n1.value = 2 AND n2.value = 10 AND SUBSTRING(n1.word, 1, 1) = SUBSTRING(n2.word, 1, 1) 
      AND l.language_family = 'Indo-European';