2012-07-12 72 views
-1

我有4条记录(在家中,办公室,度假,酒店)和共享提起addresstypeid表地址表AddressTypes。SQL交叉联接空值

在地址表中我有型“家”的1条,我想查询从哪里获得4行是这样的:

Type  Address1 Address2 City State 

home  piping 1232  Austin Tx 
office null  null  null null 
vacation null  null  null null 
hotel null  null  null null 

下面是表的图像:http://tinypic.com/view.php?pic=28078xv&s=6

我敢肯定是非常容易的,也许使用交叉连接但不知道它。希望有人能指导我。提前欣赏。

+0

我不明白你的问题,你能展示你想要产生这个结果的两个表的样本。 – automatic 2012-07-12 22:57:09

+1

你可能想编辑你的标题,所以它不建议一个可能不正确的解决方案(交叉连接可能不是答案)。 – automatic 2012-07-12 22:58:56

+0

下面是表http://tinypic.com/view.php?pic=28078xv&s=6 – VAAA 2012-07-12 23:06:25

回答

1

Left joining AdddressTypes到的地址,将会产生期望的结果:

select at.Type, 
     a.Address1, 
     a.Address2, 
     a.City, 
     a.State 
    from AddressTypes at 
    left join Address a 
    on at.AddressTypeID = a.AddressTypeID 
-- For this query to make sense 
-- Filter one person only 
    and a.PersonID = @PersonID 

-----------这部分下,加入由VAAA ------------- -----------

尼古拉,我改成这样:

select at.description, 
     a.Address1, 
     a.Address2, 
     a.City 
    from address_types at 
    left join Address a 
    on 1 = 1 
-- For this query to make sense 
-- Filter one person only 
    and a.addressid = 24 

然后我得到的4行,但它们都具有相同的地址信息,并仅作为“家庭“类型的地址是具有数据的地址。因此,它的关闭...

+0

尼古拉将只输出1行。刚刚尝试过。这里是表模式。 http://tinypic.com/view.php?pic=28078xv&s=6 – VAAA 2012-07-12 23:07:34

+0

@VAAA我的错误 - 我在右表放置了一个过滤器。请检查更新后的答案(更改为和)。 – 2012-07-12 23:11:25

+0

尼古拉,我没有看到更新的答案..只是我的编辑:)也许我编辑当你更新:) – VAAA 2012-07-12 23:13:10

0

使用LEFT OUTER JOIN,这从两个表的左和右表和不匹配的记录都返回匹配的记录副本。这里是我试过的测试代码:

CREATE TABLE AddressTypes(
    AddressType SMALLINT NOT NULL, 
    [Description] NVARCHAR(50)) 

ALTER TABLE AddressTypes 
ADD CONSTRAINT PK_AddressTypes_AddressType 
    PRIMARY KEY (AddressType) 


CREATE TABLE [Address] (
    AddressID INT NOT NULL, 
    AddressType SMALLINT, 
    Address1 NVARCHAR(50), 
    Address2 NVARCHAR(50), 
    City NVARCHAR(50), 
    State CHAR(2)) 

ALTER TABLE [Address] 
ADD CONSTRAINT PK_Address_AddressID 
    PRIMARY KEY (AddressID) 

ALTER TABLE [Address] 
ADD CONSTRAINT FK_address_addresstypes_addresstype 
    FOREIGN KEY (AddressType) REFERENCES AddressTypes(AddressType) 


INSERT INTO AddressTypes VALUES (1, 'home'), (2, 'office'), 
           (3, 'vacation'), (4, 'hotel') 
INSERT INTO address VALUES (1, 1, 'piping', '1232', 'Austin', 'TX') 

    -- Here is the query that outputs the result set. 
    SELECT AT.AddressType AS [Type], A.Address1, A.Address2, A.City, A.State 
    FROM AddressTypes AT 
    LEFT OUTER JOIN address A 
    ON AT.AddressType = A.AddressType