【问题标题】:JOIN on Subquery加入子查询
【发布时间】:2012-04-27 23:04:12
【问题描述】:

我想在其中一个表上使用 id 连接两列后,在两个表上执行简单连接。

第一步:

SELECT cars.hhid & cars.vmid
FROM cars

现在我想将此结果与另一个表(table2)进行比较。

新结果应该是table1(汽车)中与table2中的id匹配的每一行。

怎么了?

我的代码:

SELECT Cars.* 
FROM (SELECT Cars.hhid & Cars.vmid AS zid
FROM cars) x
JOIN table2 ON table2.id = x.zid;

【问题讨论】:

    标签: sql ms-access join subquery


    【解决方案1】:

    * TSQL 的答案,在学习之前是 MS-Access *

    SQL 没有 double 数据类型,因此您需要使用浮点数。

    要使用连接运算符+,需要使用CASTCONVERT 将值转换为字符串

    数据:

    declare @cars table (hhid float, vmid float)
    declare @table2 table (id float)
    
    insert @cars values (1,1),(2,2)
    insert @table2 values (11),(22),(12),(21)
    

    查询:

    SELECT x.* 
    FROM (
        SELECT CAST(c.hhid AS nvarchar(20)) + CAST(c.vmid AS nvarchar(20)) AS zid
        FROM @cars c
        ) x
    INNER JOIN @table2 t ON t.id = x.zid
    

    * 尝试 MS-Access *

    这个工作更好吗,在我看来你的表引用有点扭曲

    SELECT x.* 
    FROM (SELECT c.hhid & c.vmid AS zid
    FROM cars c) x
    JOIN table2 t ON t.id = x.zid;
    

    【讨论】:

    • 非常感谢您的快速答复。 hhid、vmid(在“cars”表上)和 id(在 table2 上)的数据类型是 double
    • 更新了 double\float 数据类型的答案
    • 我正在使用(德语)MS-Access,它响应错误:Unzulässige SQL-Anweisung; '删除','插入','选择','程序',或者'更新'erwartet。表示:SQL 语句不正确,Access 正在寻找 DELETE'、'INSERT'、'SELECT'、'PROCEDURE' 或 'UPDATE'
    • 啊,不知道这是 MS-Access。我认为不支持 CAST/CONVERT。你可以使用Cstr 转换成字符串吗
    • 我已将数据类型更改为字符串。我认为不再需要演员阵容。不是吗?还有什么我可以尝试的吗?
    【解决方案2】:

    试试

    SELECT x.* 
    FROM (SELECT Cars.hhid & Cars.vmid AS zid
    FROM cars) x
    INNER JOIN table2 ON table2.id = x.zid;
    

    要指定MS Access之类的连接类型。

    【讨论】:

    • thx 4 帮助。我尝试了您的查询(使用 c 作为小写字母类型)。不幸的是仍然无法正常工作。
    • @Simon 是 table2.id 文本字段吗?
    【解决方案3】:

    从你在问题中所说的,我不明白你为什么需要一个子查询。

    试试这个:

    select cars.*
    from cars 
    inner join table2 on cstr(table2.id) = cars.hhid & cars.vmid
    

    (测试double作为所有三个字段的数据类型)

    您不需要子查询,因为您可以将“连接的列”直接放入 JOIN 子句(当然,如果您需要它们,也可以将它们放入 SELECT 子句)。

    但是,一旦您连接列,Access 似乎将它们视为string,因此您不能直接在table2double 列上加入它们。
    这就是为什么您需要将 table2 中的列转换为带有CStr() 的字符串。

    【讨论】:

    • 嗨克里斯蒂安,谢谢你的解释。你的代码正是我想做的。你们这里真棒!
    • @Simon:如果我的回答对您有帮助,您最好accept。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2011-02-04
    • 2011-07-20
    相关资源
    最近更新 更多