Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/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
Mysql SQL查询:根据以前的查询和合并结果进行的查询_Mysql_Sql_Postgresql_Dependencies - Fatal编程技术网

Mysql SQL查询:根据以前的查询和合并结果进行的查询

Mysql SQL查询:根据以前的查询和合并结果进行的查询,mysql,sql,postgresql,dependencies,Mysql,Sql,Postgresql,Dependencies,以下问题: 查询2和查询3取决于查询1的结果,查询4取决于查询2的结果。在不多次执行同一查询的情况下,如何表达这些查询 例如: 查询1 SELECT id, color, part FROM T1 查询2 SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1) 查询3 SELECT id from T3 where T3.part in (SELECT id, color, part FROM T

以下问题:

查询2和查询3取决于查询1的结果,查询4取决于查询2的结果。在不多次执行同一查询的情况下,如何表达这些查询

例如:

查询1

SELECT id, color, part FROM T1
查询2

SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1)
查询3

SELECT id from T3 where T3.part in (SELECT id, color, part FROM T1)
查询4

SELECT id from T4 where T4.owner in (SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1))
编辑

最后我需要结果的并集

Query1 union Query2 union Query3 union Query4

现在您可以看到,我已经复制并粘贴了前面的查询,一定有更好的方法

只需通过特定列将它们连接起来即可

select * from T1  
inner join T2  on T1.color=T2.color 
inner join T3 on T3.part=T1.part 
inner join T4 on T4.owner=T2.owner

你真的需要四个不同的结果集吗?您希望在每个集合中包含多少行,以及T1、T2、T3、T4是什么类型的实体——因为可以将这些查询组合到一个集合中

此外,这:

SELECT id, owner FROM T2 WHERE T2.color in (SELECT id, color, part FROM T1)
不是有效的SQL,您的意思可能是:

SELECT id, owner FROM T2 WHERE T2.color in (SELECT color FROM T1)

您可以使用连接语法而不是INoh抱歉,我遗漏了我有每个查询的联合结果。您的联合结果是不可能的,因为您在每个结果集中使用了不同的字段。请更正sql错误。。。我只想给出一个简单的例子,因为我正在处理的那个更复杂,它们都有相同的实体,但都是原始实体的子集table@user944308子集是否定义为视图?这很困难,因为还不清楚T2和T1的关系。如果你用通俗易懂的英语回答这个问题,可能会容易得多。MySQL还不支持公共表表达式/子查询分解,因此您可能需要重复子查询。然而,这并不一定是坏事,因为1)每种情况下的操作都可以单独优化,或者2)优化器可以将它们组合起来。我会首先担心代码质量和可维护性,然后是性能(在看到执行计划中存在问题的证据之后)。@user944308,几乎每次有人这样简化时,他们都会得到错误的答案,因为复杂性是问题的一部分。请以后不要这样做。当不需要查询时不要使用子查询。当子查询返回太多结果时,IN()可能会变慢。使用连接,更容易阅读和理解。@Frank Heikens虽然我同意连接通常更容易阅读和更清晰,但连接在语义上与IN不同。IN将有效地从IN中的集合中删除重复项,而JOIN可能会导致类似于叉积的效果。就性能而言,它们通常是相同的,因为优化器可以非常擅长它们(至少在SQL Server中是如此)。与所有查询一样,它至少有助于检查执行计划,以确保它不会以非常低效的方式获得您声明的结果。