2012-06-19 122 views
2

大约一周前刚刚启动SQL,我想知道为什么这给了我一个错误。 如果我在顶部选择*,我可以看到ITEM_NUMBER以及是否使用了其他列名称,但我看不到这一个。SQL - 从子查询中选择主键

我使用Oracle和ORDER_DELIVERABLES将ITEM_NUMBER作为主键,而DIGITALPRODUCT_ORDER.ITEM_NUMBER将它作为PF,我假设它是Primary Foreign?

如果任何人都可以帮助我,也许可以解释一点,那会很棒。 谢谢!

SELECT ITEM_NUMBER 
FROM 
(
    SELECT * 
    FROM ORDER_DELIVERABLES 
    INNER JOIN DIGITALPRODUCT_ORDER 
      ON DIGITALPRODUCT_ORDER.ITEM_NUMBER = ORDER_DELIVERABLES.ITEM_NUMBER 
) 

回答

3

它返回什么错误?

我怀疑这是一个模棱两可的字段错误,因为在select零件中使用*选择2个表中的item_number,所以引擎不知道要采取哪一个。试试这个:

SELECT t.it 
FROM 
(
    SELECT o.ITEM_NUMBER it 
    FROM ORDER_DELIVERABLES o 
     INNER JOIN DIGITALPRODUCT_ORDER d ON d.ITEM_NUMBER = o.ITEM_NUMBER 
) t 

至于评论,您的查询实际上可以做到这样:

SELECT o.ITEM_NUMBER 
FROM ORDER_DELIVERABLES o 
     INNER JOIN DIGITALPRODUCT_ORDER d ON d.ITEM_NUMBER = o.ITEM_NUMBER 
+0

虽然这个版本使得再选择毫无意义...... – Neil

+0

是的,我tryed到*正确的只有* ...但你说得对,我要添加一些信息 – Sebas

+0

标识他只选择项目数,他可以用ORDER_DELIVERABLES中的'SELECT o.ITEM_NUMBER'替换一个存在子句的连接(这非常昂贵)o WHERE EXISTS(SELECT NULL FROM DIGITALPRODUCT_ORDER d WHERE d.ITEM_NUMBER = o.ITEM_NUMBER)'。 – corsiKa

0

你必须考虑在两个层面:

1)让我们获取从主键ORDER_DELIVERABLES:

SHOW INDEX FROM ORDER_DELIVERABLES 

2)让我们建立它到主查询

​​

这个逻辑基于MySQL,但我确定如果你查阅Oracle手册,你可以找到如何从表中访问主键而不用疯狂连接:)。

+0

显示索引不仅显示主键 – Sebas