2017-03-21 117 views
-2

我无法使用SQL Server中的JOIN从两个表中获取完整记录。如何从SQL Server 2008 R2中的两个表中获取完整记录

我需要两个表中的全部细节,其中ID=1

我有表Blog & Category

Blog表:

ID BlogTitle  CatID  Public 
-------------------------------------- 
1 Title One  10   1 
2 Title Two  0   1 
3 Title Three  NULL  1 

Category表:

CatID CatName 
-------------------- 
10  Category One 
20  Category Two 

查询

SELECT 
    ID, BlogTitle, c.CatID, CatName 
FROM 
    Blog b 
FULL OUTER JOIN 
    Category C ON b.CatID = c.CatID 
WHERE 
    Public = 1 AND ID = 1 

从这个查询,我得到以下结果:

ID BlogTitle  CatID  CatName 
---------------------------------------- 
1 Title One  NULL  NULL 

虽然我期待下面的结果

ID BlogTitle  CatID  CatName 
---------------------------------------------- 
1 Title One  10   Category One 

我尝试一些东西,但我不知道我做错了。

+0

只是为了仔细检查:是CATID的两个表中的数据类型一样吗?你确定,你正在为所需的记录存储相同的值(在这种情况下,10没有空格和不可打印的字符)?如果在左边的表上有一个常量过滤器,则不需要完全联接,因为它会将结果减少到仅包含所有空值的值。 – Pred

+0

请粘贴SELECT ID的输出,BlogTitle,c.CatID,CatName FROM Blog b FULL OUTER JOIN类别C ON b.CatID = c.CatID WHERE Public = 1 – ProgrammerBoy

+0

@Pred,是两个CatID都是'Int'键入两个表中。不知道为什么这让我非常头疼..我在两张表中都有交叉检查记录。 – Learning

回答

1

移动条件从WHEREON获得外连接的结果:

SELECT ID, BlogTitle, c.CatID, CatName 
FROM Blog b 
FULL OUTER JOIN Category C 
    ON b.CatID = c.CatID 
    AND Public = 1 AND ID = 1 
+0

我只需要得到一个记录,其中id = 1 – Learning

+0

你的意思是你只想要总共1条记录,其中id = 1或者你只想记录id = 1? – jarlh

+0

我想获取记录,其中id = 1在我的情况下,ID实际上是主键,因此总会有一条记录。 – Learning

0

您的where声明ID = 1有且只有一个符合这个条件的记录。这是你没有得到所有记录的原因。

试试这个,而不是把where的条件放在ON条款中。像

SELECT ID, BlogTitle, c.CatID, CatName FROM Blog b FULL OUTER JOIN Category C ON (b.CatID = c.CatID and Public = 1 AND ID = 1)

+0

我只需要记录id = 1 – Learning

+0

那么,如果你只需要ID = 1的记录,为什么不从左到右的职位类别? – Pred

+0

Letf joing只能从左边的表中得到srecord并且右边的表显示为空 – Learning

0
Use JOIN to get your result : 

    CREATE TABLE #table (ID INT , BlogTitle VARCHAR(100) , CatID INT , 
    _Public INT) 
    CREATE TABLE #table1 (CatID INT , CatName VARCHAR(100)) 

    INSERT INTO #table1 (CatID , CatName) 
    SELECT 10,'Category One' UNION ALL 
    SELECT 20,'Category Two' 

    INSERT INTO #table (ID , BlogTitle , CatID , _Public ) 
    SELECT 1,'Title One',10,1 UNION ALL 
    SELECT 2,'Title Two',0,1 UNION ALL 
    SELECT 3,'Title Three',NULL,1 

    SELECT ID, BlogTitle , #table.CatID ,  CatName 
    FROM #table 
    JOIN #table1 ON #table.CatID = #table1.CatID 
    WHERE Id = 1 
+0

@学习,试试上面的查询。 – Mansoor

+0

这将得到所有记录,我只需要记录符合WHERE条件'where ID = 1' – Learning

+0

这将只从左边的数据表中获得数据,它显示空的CategoryName和CatID – Learning

2

尝试:

SELECT Blog.ID, Blog.BlogTitle, Blog.CatID, Category.CatName 
FROM Blog 
INNER JOIN Category 
ON Blog.CatID = Category.CatID 
WHERE 
Blog.ID = 1 
AND 
Blog.Public = 1 
+0

这不会得到任何东西 – Learning

+0

@学习 - 这不会从哪里得到什么?你确定你的问题表中的数据和样本数据是否一样? –

+0

Boy(@Learning),如果您没有从内部连接查询中获取任何内容,则表中没有可以加入的匹配记录。检查您是否从CatID = 10的Blog中的select *获得记录;选择* from CatID = 10 – ProgrammerBoy

0
SELECT B.ID,B.BlogTitle,C.CatID, C.CatName FROM 
(SELECT ID, BlogTitle,CatID FROM Blog WHERE Public = 1 AND ID = 1) B 
FULL OUTER JOIN Category C 
    ON b.CatID = c.CatID 
相关问题