包含空表时,查询不返回预期结果

时间:2013-12-08 11:04:25

标签: sql sql-server sql-server-2012

我有三个表定义为:

CREATE TABLE [garageInfo] ( 
    [griId] int identity(1,1)  NOT NULL,
    [grId] int NOT NULL,
    [shId] int NOT NULL,
    [subEquipment] varchar(100) NULL,
    [make] varchar(50) NULL,
    [model] varchar(50) NULL,
    [serialNo] varchar(50) NULL,
    [pcr] varchar(50) NULL,
    [mop] varchar(50) NULL,
    [mopDesc] varchar(50) NULL
)
;

CREATE TABLE [car] ( 
    [crId] int identity(1,1)  NOT NULL,
    [crDli] smallint NULL,
    [crName] varchar(60) NULL
)
;
CREATE TABLE [garage] ( 
    [grId] int identity(1,1)  NOT NULL,
    [grName] varchar(100) NOT NULL,
    [grDli] smallint NULL,
    [crId] int NOT NULL
)
;

garagecar包含数据,并在运行以下查询时返回预期记录。

select * from garage p, car m WHERE p.crId=m.crId 

但是garageInfo目前是空的,但是会随着时间的推移填满记录,但是我有以下查询我运行哪个给了0行作为回报,我期望它给我的是garageInfo的所有列都为空,其他表中的两列具有各自的值,但事实并非如此。

select * from garage p, car m, garageInfo gr WHERE p.crId=m.crId AND gr.grId=p.grId

有人可以帮我解决这里的错误吗?

1 个答案:

答案 0 :(得分:2)

您正在使用空表进行INNER JOIN。这将总是给你0个结果(INNER JOIN给你3个表之间的“交集”。因为其中一个是空的,交集不存在。)

如果您想要车库和汽车的信息,即使没有来自garageInfo的信息,您也必须使用garage_info进行LEFT JOIN

SELECT *
FROM garage p,
INNER JOIN car m ON p.crId = m.crId
LEFT JOIN garageInfo gr ON gr.grId = p.grId