使用一个查询而不是两个查询

Use one query instead of two queries

我有一个类似示例的查询。查询中有重复,我想将其最小化。我怎样才能做到这一点?对不起,如果这是一个非常简单的问题。我是数据库和SQL.

领域的新手
SELECT * 
FROM Table1 
WHERE column1 IN (SELECT DISTINCT column1 
                  FROM Table2 
                  WHERE column2 = (SELECT column2 
                                   FROM Table4 
                                   WHERE column3='1324654') 
                  UNION 
                  SELECT DISTINCT column1 
                  FROM Table3 
                  WHERE column2 = (SELECT column2 
                                   FROM Table4 
                                   WHERE column3='1324654'));

子查询中重复:

SELECT column2 
FROM Table4 
WHERE column3='1324654' 

您可以声明一个变量来保存重复查询的结果。 像这样:

declare @result varchar=(SELECT column2 FROM Table4 WHERE column3='1324654')

然后在查询中使用它:

SELECT * FROM Table1 WHERE column1 IN 
(SELECT DISTINCT column1 FROM Table2 WHERE 
column2=@result 
UNION 
SELECT DISTINCT column1 FROM Table3 WHERE 
column2=@result);

@ugur,您可以使用 PL/SQL 并创建一个变量,正如@st 建议的那样,但是,如果您担心性能,您不妨只使用 SQL-only 并离开就像现在一样:重复的子查询是确定性的,很可能会被缓存,不会造成性能损失。

如果您只想删除重复项

SELECT *
FROM table1
WHERE column1 IN
    ( WITH data AS
    (SELECT column2
    FROM table4
    WHERE column3 = '12324654'
    )
SELECT distint column1
FROM table2,
    data
WHERE table2.column2 = data.column2
UNION
SELECT distinct column1
FROM table3,
    data
WHERE table4.column2 = data.column2
    );

您还可以使用 with 子句:

select *
  from table1
 where column1 in (with tab_helper as 
                   (select column2
                      from table4
                     where column3 = '1324654') 
                     select distinct column1
                       from table2,
                             tab_helper
                      where column2 = tab_helper.column2 
                      union 
                      select distinct column1 
                       from table3,
                            tab_helper 
                     where column2 = tab_helper.column2);