Sql 有没有办法简化我的代码?左连接多个select语句
我找到了一种方法,将6个不同的select语句组合成一个很长的行,我可以使用select语句从中过滤数据。它就像我需要它一样工作,但是我觉得我有大量的冗余代码。有没有什么方法可以在不改变功能的情况下简化我的代码Sql 有没有办法简化我的代码?左连接多个select语句,sql,oracle,Sql,Oracle,我找到了一种方法,将6个不同的select语句组合成一个很长的行,我可以使用select语句从中过滤数据。它就像我需要它一样工作,但是我觉得我有大量的冗余代码。有没有什么方法可以在不改变功能的情况下简化我的代码 SELECT * FROM ( SELECT row1 FROM db1 JOIN db2 ON ... JOIN db3 ON ... WHERE ...) t1 LEFT JOIN ( SELECT value_to_join FROM db4 v1, db1 JOIN db2
SELECT * FROM
(
SELECT row1 FROM db1
JOIN db2 ON ...
JOIN db3 ON ...
WHERE ...) t1
LEFT JOIN
(
SELECT value_to_join FROM db4 v1, db1
JOIN db2 ON ...
JOIN db3 ON ...
WHERE ...) t2
ON t1.other_value = t2.other_value
LEFT JOIN
(
SELECT value_to_join FROM db4 v2, db1
JOIN db2 ON ...
JOIN db3 ON ...
WHERE ...) t3
ON t1.other_value = t3.other_value
我的输出是第一个select语句中的一行,它与来自db4的5个不同值连接在一起。当我连接其他表(db2,db3)时,这5个值只能与db1连接,因为没有公共列可以连接
更多信息:此格式的左连接
一直使用到t6
,ON分别为t1.value=tn.value
,n分别增加。每个子查询中的join语句在所有6个子查询中都是相同的,因此我假设必须有一种方法来简化它。“…”只是每个子句后面的一堆代码。如果您的RDBMS支持不太旧的SQL版本(SQL 3/SQL:1999),您可以使用CTE来实现这一点:
WITH myquery (value,…) AS (
SELECT * FROM db4, db1
JOIN db2 ON ...
JOIN db3 ON ...
WHERE ...)
SELECT * FROM
(
SELECT * FROM db1
JOIN db2 ON ...
JOIN db3 ON ...
WHERE ...) t1
LEFT JOIN myquery t2
ON t1.value = t2.value
LEFT JOIN myquery t3
ON t1.value = t3.value
…
但是,您需要将第一次查询中的“
value、
”和“SELECT*
”替换为所需列的确切列表。最好将代码简化为核心问题。但是你减少的太多了。很难说你需要什么。示例数据可能会有所帮助。@juergend增加了一点,我唯一真正需要的是一种重新格式化的方法,使其更易于阅读/编辑,因为我现在所做的只是重复的代码块,有一些小的更改。您能提供示例输入数据和预期结果吗?这很奇怪,很可能你不必这么做,但从你提供的信息来看,很难判断总体目标是什么。