sql - 如何避免在多个表上的 SQL 上使用笛卡尔积

标签 sql sql-server join outer-join cartesian-product

这是我的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/

相关文章:

c# - SQL 服务器 2008 : update increment logic difficulty

sql - SQL Server 2008 中将表达式转换为数据类型日期时间的算术溢出错误

sql - 拆分 SQL 结果

mysql - SQL查询日期内销售的产品数量?

mysql - 清理 MySQL 中的三重连接

sql - 为什么使用 OR 条件而不是 Union 会导致性能问题

sql - 周三至周三报告

javascript - 使用HTML/Js访问SQL数据库

sql-server - Visual Studio团队在线服务-运行sql脚本

Mysql,双重连接两次使用同一张表,但间接