Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
学习FMP12中的ExecuteSQL,几个问题_Sql_Filemaker_Correlated Subquery - Fatal编程技术网

学习FMP12中的ExecuteSQL,几个问题

学习FMP12中的ExecuteSQL,几个问题,sql,filemaker,correlated-subquery,Sql,Filemaker,Correlated Subquery,我加入了一份新的工作,要求我使用FileMaker(并逐步将系统转换到其他数据库)。我在MS SQL Server数据库做了两年的数据库管理员,我非常精通PL/SQL和T-SQL。我正试图使用ExecuteSQL函数将我的SQL知识扩展到FMP,我遇到了很多小麻烦:) 我有两张桌子:电影和流派。相关栏目包括: 电影(电影ID、电影名称、GenreId、分级) 流派(GenreId,流派重命名) 我正在努力寻找每种类型中收视率最高的电影。对此的SQL查询将是: SELECT M.MovieName

我加入了一份新的工作,要求我使用FileMaker(并逐步将系统转换到其他数据库)。我在MS SQL Server数据库做了两年的数据库管理员,我非常精通PL/SQL和T-SQL。我正试图使用ExecuteSQL函数将我的SQL知识扩展到FMP,我遇到了很多小麻烦:)

我有两张桌子:电影和流派。相关栏目包括:

电影(电影ID、电影名称、GenreId、分级)

流派(GenreId,流派重命名) 我正在努力寻找每种类型中收视率最高的电影。对此的SQL查询将是:

SELECT M.MovieName

    FROM Movies M INNER JOIN Genres G ON M.GenreId=G.GenreId

    WHERE M.Rating=

   (

         SELECT MAX(Rating) FROM Movies WHERE GenreId = M.GenreId

   ) 
我尽可能地将其转换为ExecuteSQL查询:

ExecuteSQL ("

SELECT M::MovieName FROM Movies M INNER JOIN Genres G ON M::GenreId=G::GenreId

WHERE M::Rating =

(SELECT MAX(M2::Rating) FROM Movies M2 WHERE M2::GenreId = M::GenreId)

"; "" ; "")
我将字段类型设置为Text,并确保不存储值。但我看到的只是“?”标记

我在这里做错了什么?如果这真的很愚蠢,我很抱歉,但我是FMP的新手,任何建议都将不胜感激

谢谢大家!

-- 公羊

更新:解决方案和达到目标所需的思考过程:

感谢所有帮助我解决问题的人。你们让我意识到,传统的SQL思维过程并不完全适用于FMP,当我四处探索时,我意识到要在FMP中最好地使用SQL知识,我应该独立地考虑每一列,而不是在编写查询时考虑整个结果集。这意味着对于我当前的功能来说,连接不再是必需的。加入是为了引入GenreName,这是FMP自动映射的另一列。我只需要删除连接,它工作得非常好。 TL;DR:思维过程上下文应该是当前列,而不是整个预期结果集


再次感谢@MissJack、@Chuck(你是怎么得到这个用户名的?)、@pft221和@michael.hor257k

我发现FileMaker在使用ExecuteSQL函数格式化查询方面非常特别。在许多情况下,标准SQL语法可以很好地工作,但在某些情况下,您必须进行一些轻微(但很重要)的调整

我可以在这里看到两个可能导致问题的因素

ExecuteSQL ("

SELECT M::MovieName FROM Movies M INNER JOIN Genres G ON
M::GenreId=G::GenreId

WHERE M::Rating =

(SELECT MAX(M2::Rating) FROM Movies M2 WHERE M2::GenreId = M::GenreId)

"; "" ; "")
  • 您不能在查询中使用标准FMP
    table::field
    格式。

    在ExecuteSQL函数内的引号中,您应该遵循
    table.column
    的SQL格式。所以
    M::MovieName
    应该是
    M.MovieName


  • 我在您的代码中没有看到
    作为


    要创建别名,必须显式声明它。例如,在您的
    FROM
    中,它应该是作为M
    电影
  • 我想如果你解决了这两件事,它可能会起作用。然而,我自己在连接方面遇到了一些麻烦,因为我的主要经验是使用FMP,而我只是刚刚对SQL语法更加熟悉

    因为在FMP中调试SQL非常困难,所以这里我能给你的最好建议是从小处着手。从一个非常基本的查询开始,一旦确定该查询工作正常,就逐步一次添加一个更复杂的元素,直到遇到可怕的

    关于ExecuteSQL,有很多很棒的帖子:

    • 由于您已经熟悉SQL,我将从以下内容开始:。如果你向下滚动到文章的底部,就会有一个链接指向整篇文章的PDF

    • 我本来打算推荐一些更具体的文章(比如关于健壮编码或动态参数的系列),但由于我是新来的,我不能包含超过2个链接,所以只需转到FileMaker Hacks并搜索“ExecuteSQL”。你会发现许多有用的帖子


    NB如果您使用的是FMP Advanced,Data Viewer是测试SQL的绝佳工具。但要注意:大型数据库上的复杂查询有时会导致程序崩溃或冻结。

    使用FileMaker和
    ExecuteSQL()
    时,首先要记住的是表和表引用之间的差异。这是一个FileMaker特有的概念。简而言之,表存储数据,但表引用定义了该数据的上下文。表引用是您在FileMaker的关系图中看到的,并且
    ExecuteSQL()
    函数需要在其查询中引用表引用


    我同意MissJack的观点,即在构建SQL语句时需要从小处着手,并在FileMaker Pro Advanced中使用Data Viewer,但我可以提供另外一个建议,即使用。它确实需要添加表引用和字段来复制现有解决方案中的命名,但这很容易做到,而且它们提供的文件包括一个用于构建SQL查询的向导。

    只需添加注释即可插入SQL Sugar模块,这在构建查询时对我非常有帮助:谢谢@MissJack-一旦我到达一台安装了FMP的机器,我就会使用这些。FMP与我处理过的所有不同的数据库在一种不那么进步的方式上有着根本性的不同,这让我很恼火@RamRS记住Filemaker不是SQL数据库。虽然它支持有限的一组SQL命令,但通常最好利用本机技术。@michael.hor257k我知道,但我的任务是将系统迁移到MySQL或Oracle,但雇主还希望保持与FileMaker的兼容性,以便他们可以创建报告。如果我在同步时遇到ETL过程中的任何问题,我可以使用一些SQL来解决它们。