2016-01-16 31 views
-2

[My Tables Diagram ]复杂的表连接的SQL

PLS我想根据PressKit表数据从文章表中获取数据

我需要帮助如何文章表和PressKit表

虽然我之间的连接它们之间是不同的中间表?

我想要得到的数据一样,

SELECT ArticleID , 
     ArticaleTile 
FROM Articles 
WHERE dbo.MagazineID IN (
     SELECT dbo.Magazines.MagazineID 
     FROM dbo.Magazines 
       INNER JOIN dbo.PressKitMagazines ON dbo.Magazines.MagazineID = dbo.PressKitMagazines.MagazineID 
     WHERE PressKitID = @PressKitID) 
     AND ClassID IN (
     SELECT Class.classID 
     FROM dbo.Class 
       INNER JOIN dbo.PressKitClass ON Class.classID = PressKitClass.classID 
     WHERE PressKitID = @PressKitID) 
+0

从文章中选择ArticleID,ArticaleTile ......... .....其中PressKitID = @ PressKitID我需要帮助加入帐号 –

+0

“从...中获取数据...根据Table Table中的数据” &“表和表之间的连接”不清楚。使用更多的单词和简单句子来解释你的意思,而不是像“get”和“根据”和“between”之类的模糊词语。在每张桌子上,连线说什么?在查询结果中,连续行的含义是什么?显示您的表格定义和示例输入和输出。 – philipxy

+0

我采取这么久..我想删除“在哪里”与加入 –

回答

0
SELECT ArticleID, ArticleTitle 
FROM Articles a 
JOIN dbo.PressKitMagazines pm 
ON a.MagazineID = pm.MagazineID AND pm.PressKitID = @PressKitID 
JOIN dbo.PressKitClass pc 
ON a.ClassID = pc.ClassID AND pc.PressKitID = @PressKitID 

你并不需要涉及MagazinesClassPressKit因为你并不需要返回与他们ID S相关的Name秒。你并不需要他们在您的原始查询之一:

SELECT ArticleID, ArticleTitle 
FROM Articles 
WHERE MagazineID IN (
    SELECT MagazineID 
    FROM dbo.PressKitMagazines 
    WHERE PressKitID = @PressKitID) 
AND ClassID IN (
    SELECT classID 
    FROM dbo.PressKitClass 
    WHERE PressKitID = @PressKitID) 

假设表T认为,使通过其列参数为一个真正的声明了一些语句行。例如Articles认为,满足行:
        “文章条款ArticleID题为ArticleTitle在杂志MagazineID &是类的CLASSID
或简写:
       文章(ArticleID,ArticleTitle,MagazineID,ClassID)
在SQL SELECT语句中,表的列名称前缀为别名和点(当没有歧义时可以省略):
          a(a.ArticleID,a.ArticleTitle,a.MagazineID,a。的ClassID)
所以在行:
        SELECT C FROM U WHERE C IN (SELECT C FROM T WHEREcondition)
或前缀和点数:
        SELECT U.C FROM U WHERE U.C IN (SELECT T.C FROM T WHEREcondition)
都行,其中:
        SELECT U.C FROM U JOIN T ONconditionAND U.C = T.C
,因为它们都返回行只列C,其中:
        U(...,UC,...)和T(...,TC,.. )和条件 AND UC = TC

对于撰写查询,请参阅this answer

+0

Thanx philipxy它的工作原理 –

0

试试这个。它只是一个INNER JOIN与PressKitID你正在寻找的表,然后简单的WHERE子句可以决定你想要的具体参数:

SELECT 
    a.ArticleID, a.ArticleTitle 
FROM articles AS a 
INNER JOIN PressKitMagazines AS m 
ON a.magazineid = m.magazineid 
INNER JOIN PressKitClass AS c 
ON a.classid = c.classid 
WHERE 
    m.PressKitID = @PressKitID 
    OR 
    c.PressKitID = @PressKitID 
+0

原始查询将返回具有来自给定印刷工具包的杂志*和*类的文章。这会从给定的新闻资料袋中返回带有杂志或课程的文章。 – philipxy

+0

同意。如果存在匹配的@PressKitID,我将原始问题(不是查询)作为想要的文章表信息,因此我使用OR,因此无论是杂志还是课程,还是只有一个,都会返回结果。如果确实需要杂志和类,则在WHERE子句中将OR更改为AND。如果原始帖子是用其他细节编辑的,我会更新我的查询。 – Jericho

0

使用在所有情况下左连接尝试。

SELECT Articles.ArticleID , 
     Articles.ArticleTitle 
FROM dbo.Articles 
LEFT JOIN dbo.Magazines ON Magazines.MagID = Articles.MagID 
LEFT JOIN dbo.Class ON Class.ClassID = Articles.ClassID 
LEFT JOIN dbo.PressKitMag ON PressKitMag.MagID = Magazines.MagID 
LEFT JOIN dbo.PressKitClass ON PressKitClass.ClassID = Class.ClassID 
LEFT JOIN dbo.PressKit ON PressKit.PressKitID = PressKitClass.PressKitID AND PressKit.PressKitID = PressKitMag.PressKitID 
WHERE [email protected] 

如果我假设你正在使用“PressKitMagazines”对于许多人“PressKit”和“杂志”之间有很多关系,那么你应该使用一个唯一键列“PressKitMagazines”象下面这样:

enter image description here

+0

有没有需要一个ID,PK是(PressKitID,MagazineID)。此外,在LEFT JOINing中没有任何意义,因为任何具有NULL的行都会引入超出JOIN与查询结果无关的行。 – philipxy

0

目前尚不清楚是什么问题,但是,我建议使用EXISTS,像这样:

SELECT 
     A.ArticleID 
    , A.ArticaleTile 
FROM Articles AS A 
WHERE EXISTS (
      SELECT NULL 
      FROM dbo.Magazines AS M 
        INNER JOIN dbo.PressKitMagazines AS PKM ON M.MagazineID = PKM.MagazineID 
      WHERE M.PressKitID = @PressKitID 
        AND A.ArticleID = M.MagazineID 
    ) 
    OR EXISTS (
      SELECT NULL 
      FROM dbo.Class AS C 
        INNER JOIN dbo.PressKitClass PKK ON C.classID = PKK.classID 
      WHERE C.PressKitID = @PressKitID 
        AND A.ClassID = C.ClassID 
    ) 

我也相信你需要在where子句中的这两个子查询之间使用