有什么方法可以简化我的代码吗?左联接多个选择语句

时间:2019-08-19 18:47:41

标签: 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 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联接,因为没有要联接的公共列。

更多信息:left join最多使用t6格式,ON为t1.value = tn.value,n分别增大。每个子查询中的join语句在全部6个中都是相同的,因此我假设必须要有一种简化方法。 “ ...”只是每个子句后面的一堆代码。

1 个答案:

答案 0 :(得分:1)

如果您的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 *”替换为所需列的确切列表。