2016-01-16 2 views
-2

[My Tables Diagram ]комплекс стол Регистрация в SQL

Pls я хочу, чтобы получить данные из статьи таблице в соответствии с Пресс-кит Таблица данных

мне нужна помощь, как присоединиться между статьями Таблица и Пресс-кит Таблица

в то время как у меня есть на разные промежуточные между ними?

я хочу, чтобы получить данные, как этот

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

"получить данные из ... Таблица в соответствии с .. Таблица данных" & "соединяются между ... Таблица и ... Таблица" не ясны. Используйте больше слов и простых предложений, которые объясняют, что вы имеете в виду, а не расплывчатые слова типа «получить» и «в соответствии с» и «между». Что говорит строка, когда в каждой таблице? Что говорит строка, когда в результате вашего запроса? Покажите свои определения таблиц и пример ввода и вывода. – philipxy

+0

Я беру так долго .. я хочу удалить «where IN» with Join –

ответ

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 

Вам не нужно включать Magazines, Class или PressKit, потому что вам не нужно возвращать Name S, связанных с их ID с. Вам не нужно их в исходном запросе либо:

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 .TitleTitle, 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, ...) и Т (..., ТС, .. .) И состояние И UC = TC

Для составления запросов см. this answer.

+0

Thanx philipxy это работает –

0

Дайте этому попытку. Он просто делает INNER JOIN для таблиц с PressKitID, которые вы ищете, а затем просто ИНЕКЕ может определить конкретный параметр, который вы хотите:

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, чтобы он возвращал результат независимо от того, есть ли журнал и класс, или только один. Если это потребует как журнала, так и класса, то измените OR на AND в предложении WHERE. Я обновлю свой запрос, если исходное сообщение будет отредактировано с дополнительной спецификой. – 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» многие ко многим отношения между «Пресс-кит» и «Журналы», то вы должны использовать уникальный столбец ключа для «PressKitMagazines», как показано ниже:

enter image description here

+0

Нет необходимости в идентификаторе, 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.

Смежные вопросы