这是我的sqlfiddle http://sqlfiddle.com/#!3/671c8/1 。
这是我的表格:
人
PID LNAME FNAME
1 鲍勃·乔
2 史密斯·约翰
3 约翰逊· jack
4 简·多伊
表1
PID值
1 3
1 5
1 35
2 10
2 15
3 8
表2
PID值
1 X1
1 X2
1 X3
2 Z1
3 X3
我正在尝试根据一个人的 ID 连接多个表。这些表包含带有日期的事件,但日期在表中可能匹配也可能不匹配。因此,无论日期如何,我真正希望它以某种方式连接表,这样当我获得结果时,具有最大行的表将是我的结果中的行数,并且所有其他表将“适合”其中。例如
而不是笛卡尔积:
PID LNAME FNAME THINGONE THINGTWO
1 Bob Joe 3 X1
1 Bob Joe 3 X2
1 Bob Joe 3 X3
1 Bob Joe 5 X1
1 Bob Joe 5 X2
1 Bob Joe 5 X3
1 Bob Joe 35 X1
1 Bob Joe 35 X2
1 Bob Joe 35 X3
我想要这样的东西:
PID LNAME FNAME THINGONE THINGTWO
1 Bob Joe 3 X1
1 Bob Joe 5 X2
1 Bob Joe 35 X3
我的sql语句:
SELECT
p.*,
t1.value as thingone,
t2.value as thingtwo
FROM
person p
left outer join table1 t1 on p.pid=t1.pid
left outer join table2 t2 on p.pid=t2.pid
;
最佳答案
我无法理解为什么你想这样做,但是......
您需要在 table1 和 table2 之间创建人工联接,然后将其链接到主表。一种方法是按顺序对行进行排名。例如:
SELECT
p.pid, p.lname,p.fname, thingone, thingtwo
FROM
person p
left outer join
(
select ISNULL(t1.pid, t2.pid) as pid, t1.value as thingone, t2.value as thingtwo
from
(select *, ROW_NUMBER() over (partition by pid order by value) rn
from table1) t1
full outer join
(select *, ROW_NUMBER() over (partition by pid order by value) rn
from table2) t2
on t1.pid=t2.pid and t1.rn=t2.rn
) v
on p.pid = v.pid
关于sql - 如何避免在多个表上的 SQL 上使用笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23342479/