我想出了一种方法,可以将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个中都是相同的,因此我假设必须要有一种简化方法。 “ ...”只是每个子句后面的一堆代码。
答案 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 *
”替换为所需列的确切列表。