0

以下の SQL には、いくつかの DDL と単純なクエリが含まれています。

私が得ている結果は

a1|b1|c1  
a1|b2|c3  
a3|b3|c2  
a3|b3|c3  
a3|b3|c4  
a3|b3|c5  
a3|b5|c6  
a3|b5|c7

私が望む結果は

a1   |b1   |c1  
a1   |b2   |c3  
a3   |b3   |c2   
null |null |c4  
null |null |c5  
a3   |b5   |c6  
null |null |c7

MAX、MIN、rownumsなどを使用してみました。私は途方に暮れています。まったく機能しないため、試したすべてのオプションではなく、最初に使用した基本クエリのみを含めています。どんな助けでも大歓迎です!


BEGIN TRANSACTION;

drop table if exists table_A;
drop table if exists table_B;
drop table if exists table_C;

/* Create a table called NAMES */
CREATE TABLE table_A(a_Id text PRIMARY KEY, val_a text);
CREATE TABLE table_B(a_Id text, b_Id text, val_b text);
CREATE TABLE table_C(b_Id text, c_Id text, val_c text);

/* Create few records in this table */
INSERT INTO table_A VALUES('a1','va1');
INSERT INTO table_A VALUES('a2','va2');
INSERT INTO table_A VALUES('a3','va3');

INSERT INTO table_B VALUES('a1', 'b1','vb1');
INSERT INTO table_B VALUES('a1', 'b2','vb2');
INSERT INTO table_B VALUES('a3', 'b3','vb31');
INSERT INTO table_B VALUES('a2', 'b4','vb4');
INSERT INTO table_B VALUES('a3', 'b5','vb31');

INSERT INTO table_C VALUES('b1', 'c1','vc1');
INSERT INTO table_C VALUES('b3', 'c2','vc2');
INSERT INTO table_C VALUES('b3', 'c3','vc3');
INSERT INTO table_C VALUES('b2', 'c3','vc3');
INSERT INTO table_C VALUES('b3', 'c4','vc2');
INSERT INTO table_C VALUES('b3', 'c5','vc3');
INSERT INTO table_C VALUES('b5', 'c6','vc3');
INSERT INTO table_C VALUES('b5', 'c7','vc3');

COMMIT;

select
a.a_Id, b.b_Id, c.c_Id
from
table_A as a
join
table_B as b
on a.a_Id = b.a_Id
join
table_C as c
on b.b_Id = c.b_Id;
4

4 に答える 4

1

このようなものは機能するはずです(PostgreSqlでテストしましたが、Oracleでも機能するはずです)

SELECT 
  case when row_number = 1 then a_id end as a_id,
  case when row_number = 1 then b_id end as b_id,
  c_id
FROM (
  SELECT 
    a.a_Id, 
    b.b_Id, 
    c.c_Id, 
    row_number() OVER (partition by a.a_id, b.b_id order by c.c_id) as row_number, --for a_id, b_id
    row_number() OVER (partition by c.c_id order by c.c_id) as row_number2         --to avoid c_id duplicates
  FROM
    table_A  a
    join
    table_B  b on a.a_Id = b.a_Id
    join table_C  c on b.b_Id = c.b_Id
  )  innerquery
WHERE 
  row_number2 = 1 --this is to avoid c_id duplicates

SQLFIDDLE

于 2013-06-01T04:35:14.887 に答える
1
select  t1.a_id, t1.b_id, table_c.c_id
from table_c 
left join 
(
  select a_Id, b_Id, c_Id
  from 
  (
    select a.a_Id as a_id, b.b_Id as b_id, c.c_Id as c_id,
           ROW_NUMBER() OVER (PARTITION BY  a.a_ID, b.b_id ORDER BY C_ID) as aNum
    from table_A as a
    join table_B as b on a.a_Id = b.a_Id
    join table_C as c on b.b_Id = c.b_Id
  ) t2
  where aNum = 1
) t1 on  table_c.c_id = t1.c_id 
order by table_c.c_id

フィドル:

http://sqlfiddle.com/#!3/6049b/1

于 2013-06-01T05:00:27.573 に答える