【问题标题】:ms-access: select from another queryms-access:从另一个查询中选择
【发布时间】:2009-08-31 18:04:37
【问题描述】:

我正在连接对 mysql 数据库的访问。

我需要把两个语句放在一起,然后合二为一。

例如:

SELECT 
  users.id,
  users.first,
  users.last,
  chavrusas.luser_type AS user_type,
  chavrusas.id, 
  users.title, 
  users.city, 
  users.state, 
  users.home_phone, 
  users.email
FROM users
INNER JOIN chavrusas 
  ON Users.id=chavrusas.luser_id
WHERE     ((chavrusas.ruser_id)='3166' and chavrusas.ended=false) 
  AND     (chavrusas.luser_type) <> (chavrusas.ruser_type)
  AND NOT ((chavrusas.luser_type)='teacher' AND (chavrusas.ruser_type)='student')
  AND NOT ((chavrusas.ruser_type)='teacher' AND (chavrusas.luser_type)='student'); 
UNION
SELECT  
  users.id, 
  users.first, 
  users.last, 
  chavrusas.ruser_type AS user_type, 
  chavrusas.id, 
  users.title, 
  users.city, 
  users.state, 
  users.home_phone, 
  users.email
FROM users
INNER JOIN chavrusas 
  ON Users.id=chavrusas.ruser_id
WHERE     ((chavrusas.luser_id)='3166' and chavrusas.ended=false)
  AND     (chavrusas.luser_type) <> (chavrusas.ruser_type)
  AND NOT ((chavrusas.luser_type)='teacher' AND (chavrusas.ruser_type)='student')
  AND NOT ((chavrusas.ruser_type)='teacher' AND (chavrusas.luser_type)='student')
ORDER BY 4;

Users 是一个查询,它是:

SELECT 
  tblusers.*,
  tblusershliach.*,
  tbluserstudent.*,
  tbluserstudentteacher.*,
  tbluserteacher.*
FROM
(
  (
    (tblusers 
     LEFT JOIN tblusershliach 
     ON tblusers.id = tblusershliach.shliach_user_id
    )
  LEFT JOIN tbluserstudent 
  ON tblusers.id = tbluserstudent.student_user_id
  )
LEFT JOIN tbluserstudentteacher
ON tblusers.id = tbluserstudentteacher.student_teacher_user_id
) 
LEFT JOIN tbluserteacher 
ON tblusers.id = tbluserteacher.teacher_user_id;

我不想在第一个语句中使用“用户”,我只想将它们放在一个语句中

我该怎么做?

【问题讨论】:

  • @Welbog:你用什么格式化 SQL?
  • @Welbog:当然,我不使用其他工具在这里输入。我想知道,如果您使用任何工具来格式化 SQL :)
  • @shahkalpesh:没什么特别的,只是我的键盘。 SQL 并没有真正的标准格式化方式,而且我从来没有遇到过输出很好的 SQL 格式化程序,所以我手动完成。
  • @Welbog:除了点赞之外,我希望我能给你点数。谢谢!!
  • 这些表是否是 Access 本地的,或者您是否将所有这些表从 Access 链接到 mysql?如果这是对 mysql 的直通查询,您可能希望将整个 sql 作为一条语句并加入两个本地查询。

标签: sql mysql ms-access


【解决方案1】:

如果您正在考虑合并两个查询中的行(即 table1 中的 3 行和 table2 中的 2 行 = 使用最终查询的 5 行),您可以编写

SELECT * FROM TABLE1
UNION
SELECT * FROM TABLE2

要使 UNION 起作用,两个查询中的字段数应与数据类型相同。

即如果 TABLE1 有字段 numeric、numeric、text、date - TABLE2 也应该有相同数量的字段 (4) 和相同的数据类型顺序(即 numeric、numeric、text、date)。

编辑:我查看了您修改后的问题。将用户作为单独的查询而不是使其成为 MS-Access 中一个完全不可读的大查询是可以的。

Access 在您保存时不会保留 SQL 格式。因此,将查询拆分为不同的可重用部分比将所有内容都推送到自己的查询中是有意义的。

在您的示例中,如果您希望将用户作为主查询的一部分 - 必须针对两种情况重复(UNION 的左侧和右侧)。这没有意义。

编辑:这是一个大查询。感谢@Welbog。 当您在 Access 中保存查询时,格式将丢失。

EDIT2:看看这是否有帮助。我已将“USERS”查询包含在您的主 sql 中。
这个想法是匹配括号。

SELECT 
  users.id,
  users.first,
  users.last,
  chavrusas.luser_type AS user_type,
  chavrusas.id, 
  users.title, 
  users.city, 
  users.state, 
  users.home_phone, 
  users.email
FROM 
    (
        (
            (
                (tblusers AS Users
                 LEFT JOIN tblusershliach 
                 ON tblusers.id = tblusershliach.shliach_user_id
                )
                LEFT JOIN tbluserstudent 
                ON tblusers.id = tbluserstudent.student_user_id
            )
                LEFT JOIN tbluserstudentteacher
                ON tblusers.id = tbluserstudentteacher.student_teacher_user_id
        ) 
        LEFT JOIN tbluserteacher 
        ON tblusers.id = tbluserteacher.teacher_user_id;
    )
INNER JOIN chavrusas 
  ON Users.id=chavrusas.luser_id
WHERE     ((chavrusas.ruser_id)='3166' and chavrusas.ended=false) 
  AND     (chavrusas.luser_type) <> (chavrusas.ruser_type)
  AND NOT ((chavrusas.luser_type)='teacher' AND (chavrusas.ruser_type)='student')
  AND NOT ((chavrusas.ruser_type)='teacher' AND (chavrusas.luser_type)='student'); 
UNION
SELECT  
  users.id, 
  users.first, 
  users.last, 
  chavrusas.ruser_type AS user_type, 
  chavrusas.id, 
  users.title, 
  users.city, 
  users.state, 
  users.home_phone, 
  users.email
FROM
    (
        (
            (
                (tblusers AS Users
                 LEFT JOIN tblusershliach 
                 ON tblusers.id = tblusershliach.shliach_user_id
                )
                LEFT JOIN tbluserstudent 
                ON tblusers.id = tbluserstudent.student_user_id
            )
                LEFT JOIN tbluserstudentteacher
                ON tblusers.id = tbluserstudentteacher.student_teacher_user_id
        ) 
        LEFT JOIN tbluserteacher 
        ON tblusers.id = tbluserteacher.teacher_user_id;
    )
INNER JOIN chavrusas 
  ON Users.id=chavrusas.ruser_id
WHERE     ((chavrusas.luser_id)='3166' and chavrusas.ended=false)
  AND     (chavrusas.luser_type) <> (chavrusas.ruser_type)
  AND NOT ((chavrusas.luser_type)='teacher' AND (chavrusas.ruser_type)='student')
  AND NOT ((chavrusas.ruser_type)='teacher' AND (chavrusas.luser_type)='student')
ORDER BY 4;

【讨论】:

  • 你说的“工作不那么好”是什么意思。慢吗?这是由于查询的“用户”部分吗?单独运行时“用户”查询的执行速度有多快/多慢?
  • IMO,这可能是由于您的查询有问题。您可以尝试将整个查询粘贴到您的主 SQL 中,看看结果是否会发生变化,我怀疑会发生变化。
  • 感谢您的更新,但您仍在使用 USERS,我需要将这两个放在一起以便我不使用 USERS
  • 那是因为您的 SELECT 正在使用其中的字段 :)
  • 我已将 cmets 添加到您的另一个问题中。我认为,您必须编写查询以减少不必要的 JOIN 并收紧条件,从 SELECT 中删除您不需要的字段。
【解决方案2】:

您的 SQL 语句在 UNION 关键字之前包含一个分号。我不确定 Jet/ACE 是如何处理它的,但我一直认为分号的意思是“语句结束”。丢弃它,看看你的结果是否有任何不同。我完全不相信这会解决你的问题,但让我们确保它不会造成任何影响。

更新: 我做了一些测试,看起来 Jet/ACE 只是忽略了 UNION 中的分号。我找错树了。

【讨论】:

  • 汉斯,我想重申一下,这些实际上是有效的,有时只有 2-3 条记录可以返回它实际上有效
  • 汉斯,“用户”不是表格。它是已保存查询的名称。我在另一个语句中使用它
猜你喜欢
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2023-04-07
  • 2021-08-12
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多