从两个表中加入查询

时间:2011-09-21 15:57:43

标签: sql

[使用SQL Server 2000]

我无法相信一个简单的任务就是用SQL编写这个复杂的任务。

也许我错过了什么。

这是因为列名不明确而无法运行的查询:

SELECT serial_Number, system_id, date_time
FROM acp_parts ap 
INNER JOIN join test_results tr ON (ap.serial_Number=tr.serial_Number)
WHERE serial_Number IN (
    'C037687 1000 11', 'C037687 1001 11', 'C037687 1002 11', 'C037687 1003 11', 
    'C037687 1004 11', 'C037687 1005 11', 'C037687 1006 11', 'C037687 1007 11',
    'C037687 1008 11', 'C037687 1009 11', 'C037687 1010 11', 'C037687 1011 11', 
    'C037687 1012 11', 'C037687 1013 11', 'C037687 1014 11', 'C037687 1015 11',
    'C037687 1016 11', 'C037687 1017 11', 'C037687 1018 11', 'C037687 1019 11',
    'C037687 1020 11', 'C037687 1021 11', 'C037687 1022 11', 'C037687 1023 11', 
    'C037687 1024 11')
ORDER BY serial_Number, date_time

我只想在一个列中包含这些序列号的简单表,它们所在的表(system_id)以及记录时间(date_time)。

我不希望每个表都有一个单独的列 - 这会破坏我查询的目的。

这可能是我想念的简单事。

[编辑]:抱歉!我应该补充说,一个表中的序列号可能会也可能不会出现在其他表中,所以我想要显示ap.serial_Number等。

[解决方案]:以下是我使用的解决了我的问题:

SELECT serial_Number, system_id, date_time FROM ( 
    select serial_Number, system_id, date_time 
    from acp_parts ap 
    UNION ALL
    select serial_Number, system_id, date_time 
    from test_results tr
) T
where serial_Number in (
    'C037687 1000 11', 'C037687 1001 11', 'C037687 1002 11', 'C037687 1003 11', 'C037687 1004 11', 'C037687 1005 11', 
    'C037687 1006 11', 'C037687 1007 11', 'C037687 1008 11', 'C037687 1009 11', 'C037687 1010 11', 'C037687 1011 11', 
    'C037687 1012 11', 'C037687 1013 11', 'C037687 1014 11', 'C037687 1015 11', 'C037687 1016 11', 'C037687 1017 11', 
    'C037687 1018 11', 'C037687 1019 11', 'C037687 1020 11', 'C037687 1021 11', 'C037687 1022 11', 'C037687 1023 11', 
    'C037687 1024 11')
order by serial_Number, date_time

7 个答案:

答案 0 :(得分:1)

您正在加入列serial_Number,但您的order by语句未指定用于order by语句的表。任何时候表共享列名称,您需要指定您所指的表。

答案 1 :(得分:1)

如果有疑问,我总是在每个字段名称之前加上表名,例如'acp_parts.serial_Number'而不是'serial_Number'等,这通常可以解决歧义。

答案 2 :(得分:1)

两个表上肯定有相同的列名。您需要对表进行别名并指定要从哪个表中选择哪个列。示例:

select ap.serial_Number, tr.system_id, ap.date_time
from acp_parts ap inner join test_results tr on (ap.serial_Number=tr.serial_Number)
where serial_Number in (
'C037687 1000 11', 'C037687 1001 11', 'C037687 1002 11', 'C037687 1003 11', 'C037687 1004 11', 'C037687 1005 11', 
'C037687 1006 11', 'C037687 1007 11', 'C037687 1008 11', 'C037687 1009 11', 'C037687 1010 11', 'C037687 1011 11', 
'C037687 1012 11', 'C037687 1013 11', 'C037687 1014 11', 'C037687 1015 11', 'C037687 1016 11', 'C037687 1017 11', 
'C037687 1018 11', 'C037687 1019 11', 'C037687 1020 11', 'C037687 1021 11', 'C037687 1022 11', 'C037687 1023 11', 
'C037687 1024 11')
order by ap.serial_Number, tr.date_time

答案 3 :(得分:1)

我猜你应该在select语句和order by子句中使用ap.serial_Number。

希望这有助于!!

答案 4 :(得分:1)

除了JOIN之外,您没有在SELECT中使用表别名。假设我的表格正确:

select 
    ap.serial_Number
    ,tr.system_id
    ,tr.date_time
from acp_parts AS ap
inner join test_results AS tr on ap.serial_Number=tr.serial_Number
where ap.serial_Number in (
'C037687 1000 11', 'C037687 1001 11', 'C037687 1002 11', 'C037687 1003 11', 'C037687 1004 11', 'C037687 1005 11', 
'C037687 1006 11', 'C037687 1007 11', 'C037687 1008 11', 'C037687 1009 11', 'C037687 1010 11', 'C037687 1011 11', 
'C037687 1012 11', 'C037687 1013 11', 'C037687 1014 11', 'C037687 1015 11', 'C037687 1016 11', 'C037687 1017 11', 
'C037687 1018 11', 'C037687 1019 11', 'C037687 1020 11', 'C037687 1021 11', 'C037687 1022 11', 'C037687 1023 11', 
'C037687 1024 11')
order by 
    ap.serial_Number
    ,tr.date_time

答案 5 :(得分:1)

那么,这个数字只存在于一个表中还是另一个表中?我想你想要一个UNION ALL。以下内容未经过语法检查,但应该让您入门:

SELECT * FROM 
(
select 
    serial_Number, 
    system_id, 
    date_time 
from 
    acp_parts ap 

UNION ALL

select 
    serial_Number, 
    system_id, 
    date_time 
from 
    acp_parts  test_results tr
)
ORDER BY serial_Number, date_time  

答案 6 :(得分:1)

是的,你遗漏了一些简单的东西:serial_Number在两个表中,所以总是必须是合格的,即使结果不一定重要:

SELECT ap.serial_Number, system_id, date_time
FROM acp_parts ap 
INNER JOIN join test_results tr ON (ap.serial_Number = tr.serial_Number)
WHERE ap.serial_Number IN (
    'C037687 1000 11', 'C037687 1001 11', 'C037687 1002 11', 'C037687 1003 11', 
    'C037687 1004 11', 'C037687 1005 11', 'C037687 1006 11', 'C037687 1007 11',
    'C037687 1008 11', 'C037687 1009 11', 'C037687 1010 11', 'C037687 1011 11', 
    'C037687 1012 11', 'C037687 1013 11', 'C037687 1014 11', 'C037687 1015 11',
    'C037687 1016 11', 'C037687 1017 11', 'C037687 1018 11', 'C037687 1019 11',
    'C037687 1020 11', 'C037687 1021 11', 'C037687 1022 11', 'C037687 1023 11', 
    'C037687 1024 11')
ORDER BY ap.serial_Number, date_time