图表here:我对第1列和第3列感到困惑。
我正在开发一个数据仓库表,并且有两列用作获取主键的密钥。
第一列是源系统。有三个可能的值让我们说IBM,SQL,ORACLE。然后,复合键的第二部分是它可以是数字或varchar的事务ID。没有第3列。除了秘密密钥,它将是Identity(1,1)在记录加载时生成的密钥。所以在下图中我想象一下我是否传递了一个查询
Select a.Patient,
b.Source System,
b.TransactionID
from Patient A
right join Transactions B
on A.sourceSystem = B.sourceSystem and
a.transactionID = B.transactionID
where SourceSystem = "SQL"
该图表让我认为索引中的第1列应该设置为SourceSystem。因为它会立即将钻取分为第3级的下一级索引。但是当向同事展示这个图时,他们将其解释为第1列是transactionID,第2列是源系统。
列数
1 2 3
-------------
| | 1 | |
| A |---| |
| | 2 | |
|---|---| |
| | | |
| | 1 | 9 |
| B | | |
| |---| |
| | 2 | |
| |---| |
| | 3 | |
|---|---| |
答案 0 :(得分:0)
首先,您应该限定查询中的所有列名。其次,left join
通常比right join
更有意义(语义是保留第一个表中的所有列)。最后,如果你有适当的外键关系,那么你可能根本不需要外连接。
让我们考虑一下这个问题:
Select p.Patient, t.Source System, t.TransactionID
from Patient p join
Transactions t
on t.sourceSystem = p.sourceSystem and
t.transactionID = p.transactionID
where t.SourceSystem = 'SQL';
此查询的正确索引为Transactions(SourceSystem, TransactionId)
。
注意:
t.SourceSystem = 'SQL'
和p.SourceSystem = 'SQL'
可能会有不同的优化。