【问题标题】:Learning ExecuteSQL in FMP12, a few questionsFMP12中学习ExecuteSQL,几个问题
【发布时间】:2014-04-25 14:59:44
【问题描述】:

我加入了一份新工作,需要使用 FileMaker(并逐渐将系统过渡到其他数据库)。我担任 MS SQL Server 数据库的 DB Admin 已有约 2 年了,我非常精通 PL/SQL 和 T-SQL。我正在尝试使用 ExecuteSQL 功能将我的 SQL 知识平移到 FMP,但我遇到了很多小麻烦 :)

我有 2 个表格:电影和流派。相关栏目是:

电影(MovieId、MovieName、GenreId、评级)

流派(流派 ID,流派名称) 我正在尝试找到每种类型中评分最高的电影。对此的 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)

"; "" ; "")

我将字段类型设置为文本,并确保不存储值。但我看到的只是'?分数。

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

谢谢!

-- 拉姆

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

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

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

【问题讨论】:

    标签: sql filemaker correlated-subquery


    【解决方案1】:

    我发现 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)
    
    "; "" ; "")
    
    1. 您不能在查询中使用标准 FMP table::field 格式。

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

    2. 我在您的代码中的任何地方都没有看到 AS

      为了创建别名,您必须明确声明它。例如,在您的FROM 中,应该是Movies AS M

    我认为如果你解决了这两个问题,它应该可以工作。但是,我自己在 JOIN 方面遇到了一些麻烦,因为我的主要经验是使用 FMP,而且我现在才对 SQL 语法更加熟悉。

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

    FileMaker Hacks 上有很多关于 ExecuteSQL 的精彩帖子:

    • 既然您已经熟悉 SQL,我将从这个开始:The Missing FM 12 ExecuteSQL Reference。如果您向下滚动到帖子底部,则会有一个指向整篇文章 PDF 的链接。

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

    注意如果您使用的是 FMP Advanced,则数据查看器是测试 SQL 的绝佳工具。但请注意:大型数据库上的复杂查询有时会使其陷入困境并冻结程序。

    【讨论】:

    • 只是一个注释来插入 SQL Sugar 模块,这对我构建查询时非常有帮助:modularfilemaker.org/2013/03/filemaker-sql-sugar
    • 谢谢@MissJack - 一旦我到达一台安装了 FMP 的机器,我就会开始这些。 FMP 与我处理过的所有不同数据库完全不同,这让我很恼火!
    • @RamRS 请记住,Filemaker 不是 SQL 数据库。尽管它支持一组有限的 SQL 命令,但通常最好使用本机技术。
    • @michael.hor257k 我了解,但我的任务是将系统迁移到使用 MySQL 或 Oracle,但雇主也希望保持与 FileMaker 的兼容性,以便他们可以创建报告。就是这样,如果我在同步时遇到 ETL 过程中的任何问题,我可以使用一些 SQL 来解决它们。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2018-06-16
      • 2021-05-04
      • 2019-01-12
      • 2013-10-15
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多