我有以下查询
SELECT DISTINCT v.id,
( CASE
WHEN date IS NULL THEN v.o_id
ELSE (SELECT os
FROM (SELECT o_id1 os
FROM tablet t2
WHERE t2.vso_id = v.id
ORDER BY date ASC)
WHERE rownum = 1)
END ) AS p_o,
v.o_id AS k_o
FROM tablev v
LEFT JOIN tablet t
ON v.id = t.v_id;
这是我需要的: TableV具有不同的v.id值。我需要将该表与另一个表(tableT)连接,该表具有相同v.id的许多记录,然后是每个不同的v.id:
另外,aditional,如果可能的话,将o_id从1.和o_id / o_id1从2加入另一个表并写下人的名字? 我希望,而不是o_id,每个v.id将选定的o_id加入另一个表(tableO)并选择名称。
所以,我需要结果中的这些列:V.id,p_o,k_o 但如果它看起来真的很棒:v.id,p_o.name,k_o.name
答案 0 :(得分:1)
要回答您的第一个问题,假设t.vso_id
和t.v_id
是相同的事情(否则我可能误解了您的问题),请尝试此查询(我使用其他DBMS,因此您可能需要调整对COALESCE的调用一点):
SELECT v.id, COALESCE(t.o_id1, v.o_id), v.o_id
FROM tableV v
LEFT JOIN (
(SELECT vso_id, min(date) AS min_date FROM tableT GROUP BY vso_id) min_dates
JOIN tableT t
ON min_dates.vso_id = t.vso_id AND min_dates.min_date = t.date
) ON v.id = t.v_id;
以下是细分:
(SELECT vso_id, min(date) AS min_date FROM tableT GROUP BY vso_id) AS min_dates
为每个vso_id选择一个最小的日期。
(SELECT vso_id, min(date) AS min_date FROM tableT GROUP BY vso_id) AS min_dates
JOIN tableT t
ON min_dates.vso_id = t.vso_id AND min_dates.min_date = t.date
每个vso_id选择一行,该行将对应于该vso_id具有的最小日期。 最后,我将tableV连接到该查询。 COALESCE(t.o_id1,v.o_id)如果不是NULL则返回t.o_id,否则返回v.o_id。您可以使用CASE,但我发现COALESCE更适合此特定用途。
要回答第二个问题,您可以使用以下名称加入表:
JOIN table_with_names twn1 ON twn1.id = COALESCE(t.o_id1, v.o_id)
JOIN table_with_names twn2 ON twn2.id = v.o_id
并投影twn1.name和twn2.name。