2017-03-21 91 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 
相關問題