从多个表中选择多个列

Posted

技术标签:

【中文标题】从多个表中选择多个列【英文标题】:Selecting multiple columns from multiple tables 【发布时间】:2013-01-17 11:30:41 【问题描述】:

我已经为我的 netezza db 构建了流动的 SQL:

select t.TRADE_OID, t.TRADE_ID, t.TRADE_VERSION, t.TRADE_SOURCE_SYSTEM, tl.LINK_PARENT_ID, 
tl.LINK_PARENT_VERSION, tc.CHARGE_AMOUNT FROM EQ_MO_TRADE (NOLOCK) t, EQ_MO_TRADE_CHARGE (NOLOCK) tc, EQ_MO_TRADE_LINKAGE (NOLOCK) tl 
WHERE t.Last_update_time >= '2013-01-09 00:00:00' 
AND t.last_update_time < '2013-01-10 00:00:00' 
AND t.TRADE_OID = tl.TRADE_OID
AND t.TRADE_OID = tc.TRADE_OID
AND tc.CHARGE_NAME = 'Commission'

但是我得到了一般错误:

 [SELECT - 0 row(s), 0.000 secs]  [Error Code: 1100, SQL State: HY000]  ERROR:  'select 

t.TRADE_OID, t.TRADE_ID, t.TRADE_VERSION, t.TRADE_SOURCE_SYSTEM, tl.LINK_PARENT_ID, tl.LINK_PARENT_VERSION, tc.CHARGE_AMOUNT FROM EQ_MO_TRADE (NOLOCK) t, EQ_MO_TRADE_CHARGE (NOLOCK) tc, EQ_MO_TRADE_LINKAGE (NOLOCK) tl 
WHERE t.Last_update_time >= '2013-01-09 00:00:00' 
AND t.last_update_time < '2013-01-10 00:00:00' 
AND t.TRADE_OID = tl.TRADE_OID
AND t.TRADE_OID = tc.TRADE_OID
AND tc.CHARGE_NAME = 'Commission' limit 1000'
error                                                                                                                                                         

^ found "(" (at char 150) expecting `EXCEPT' or `FOR' or `INTERSECT' or `ORDER

第 150 个字符介于这两者之间:

贸易和(NOLOCK)

我的语法似乎正确,但 DBVisualiser 不会运行查询。

【问题讨论】:

您是否尝试过在FROM 子句中不使用(NOLOCK)? NOLOCK 这样的优化器提示的完整语法是WITH (NOLOCK)。毫无疑问,您知道READ UNCOMMITTED 隔离会导致幻读等问题。 【参考方案1】:

据我从 Netezza Database User's Guide (5.0.x) 得知,Netezza 不支持像 WITH (NOLOCK) 这样的优化器提示。

从第 3.36 页开始

请注意,不需要用户干预、命令或提示

无论如何,NOLOCK 被广泛认为是dubious practice。

不过,Netezza 确实支持 INNER JOIN 语法 (p2.17)

我会重写查询如下:

SELECT
    t.TRADE_OID, 
    t.TRADE_ID, 
    t.TRADE_VERSION, 
    t.TRADE_SOURCE_SYSTEM, 
    tl.LINK_PARENT_ID, 
    tl.LINK_PARENT_VERSION, 
    tc.CHARGE_AMOUNT 
FROM 
  EQ_MO_TRADE t 
    INNER JOIN EQ_MO_TRADE_CHARGE tc
            ON (t.TRADE_OID = tc.TRADE_OID)
    INNER JOIN EQ_MO_TRADE_LINKAGE tl 
        ON (t.TRADE_OID = tl.TRADE_OID)
WHERE 
  t.Last_update_time >= '2013-01-09 00:00:00' 
  AND t.last_update_time < '2013-01-10 00:00:00' 
  AND tc.CHARGE_NAME = 'Commission'

【讨论】:

以上是关于从多个表中选择多个列的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询从键表中选择多个条目到同一行的不同列中

从同一个表中的多个列中选择不同的值

SQL 从多个表中选择列而不重复数据

如何从sqlite中的多个表中选择特定列?

如何从多个表中选择列并在 yii 框架中显示

如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER