有一个包含以下表格的数据库:
table_1: id, atr1
table_2: id, atr2
table_3: id, table_1_id(Foreign Key), table_2_id(Foreign Key), atr3
我想要进行的操作有点复杂,我可以解释一下,除了SQL查询之外还要做一些额外的编程。
操作的第一部分是获取table_3中table_2的所有标识符,这些标识符符合某些条件。
SELECT table_3.table_2_id
FROM table_3
WHERE
table_3.atr3 = 'value1' AND
table_3.table_1_id = 'value2'
接下来的部分是获取我刚刚获得的每个值,然后在以下查询中使用它们。我会循环播放。
SELECT table_3.id, table_3.atr3, table_1.atr1, table_2.atr2
FROM table_3
JOIN table_1 ON table_3.table_1_id = table_1.id
JOIN table_2 ON table_3.table_2_id = table_2.id
WHERE
table_3.table_2_id = 'current_value_i_am_iterating_over' AND
(table_3.table_1_id = 'value4' OR
table_3.table_1_id = 'value5')
在查询之后,我会在一个数组中连接获得的行,该数组包含我在循环的连续迭代中获得的所有行。
我想知道的是,是否有办法避免第二个循环,理想情况下只在一个SQL查询中进行整个操作。
答案 0 :(得分:2)
您不能使用简单的子查询吗?我的意思是你可以拥有
table_3.table_2_id = (your first query with limit 1)
限制1只是为了避免从子查询返回多个记录
或者你可以使用IN
table_3.table_2_id IN (your first query)
答案 1 :(得分:1)
您可以将查询标记为in
:
SELECT t3.id, t3.atr3, t1.atr1, t2.atr2
FROM table_3 t3 JOIN
table_1 t1
ON t3.table_1_id = t1.id JOIN
table_2 t2
ON t3.table_2_id = t2.id
WHERE t3.table_2_id IN (SELECT table_2_id
FROM table_3
WHERE atr3 = 'value1' AND table_1_id = 'value2'
) AND
t3.table_1_id IN ('value4', 'value5');
这是将逻辑添加到单个查询中的最直接方式。
答案 2 :(得分:0)
;with cte as (
SELECT table_3.table_2_id
FROM table_3
WHERE
table_3.atr3 = 'value1' AND
table_3.table_1_id = 'value2')
SELECT table_3.id, table_3.atr3, table_1.atr1, table_2.atr2
FROM table_3
JOIN table_1 ON table_3.table_1_id = table_1.id
JOIN table_2 ON table_3.table_2_id = table_2.id
JOIN cte on table_3.table_2_id = cte.table_2_id
WHERE
(table_3.table_1_id = 'value4' OR
table_3.table_1_id = 'value5')
使用公用表表达式并添加额外的连接,无需循环它。