左连接包括where条件不起作用

时间:2014-07-03 15:29:18

标签: sql vb.net ms-access left-join

我疯了。似乎每个人都有同样的问题,当我谷歌'左连接不工作'时我得到的结果数量。我已经研究了所有这些,尽管付出了最大的努力,但我无法解决我的具体问题。请帮忙。

我有两张桌子;动物_Table和动物里程碑_Table。

动物中的一些动物_Table在动物里程碑_Table中有摄入记录,有些则没有。我想加入animalID上的两个表,并显示animals_Table中的所有行,包括那些在animalMilestones_Table中没有匹配的'Intake'记录的行。

以下是我尝试过的两件事,我认为这会给成功提供最好的机会,但唉,既不工作。

SELECT animals_Table.animalID, animalMilestones_Table.milestoneType
FROM animals_Table
LEFT JOIN animalMilestones_Table ON animals_Table.animalID=animalMilestones_Table.animalID
WHERE animalMilestones_Table.milestoneType="Intake"

SELECT animalID
FROM animals_Table
LEFT JOIN (SELECT milestoneType
FROM animalMilestones_Table
WHERE animalMilestones_Table.milestoneType = "Intake")
ON animals_Table.animalID = animalMilestones_Table.animalID

7 个答案:

答案 0 :(得分:1)

在我看来,你想要一个来自[animals_Table]的所有[animalID]值的列表以及一个列,该列指示[animalID]是否具有等于'Intake'的“里程碑”。如果是这样,那么我会建议:

    SELECT at.animalID, amt.milestoneType
    FROM
        animals_Table at
        INNER JOIN
        animalMilestones_Table amt
            ON at.animalID = amt.animalID
    WHERE amt.milestoneType = 'Intake'
UNION
    SELECT animalID, NULL AS milestoneType
    FROM animals_Table
    WHERE animalID NOT IN (
        SELECT animalID
        FROM animalMilestones_Table
        WHERE milestoneType = 'Intake'
    )
ORDER BY 1

来想一想,这也应该有效,并且可能会更快:

SELECT at.animalID, amt.milestoneType
FROM
    animals_Table at
    LEFT JOIN
    (
        SELECT animalID, milestoneType
        FROM animalMilestones_Table
        WHERE milestoneType = 'Intake'
    ) amt
        ON at.animalID = amt.animalID

答案 1 :(得分:0)

不确定MS Access是否支持此功能,但在SQL中,您可以将条件从WHERE子句移到LEFT JOIN,如下所示:

SELECT animals_Table.animalID, animalMilestones_Table.milestoneType
FROM animals_Table
LEFT JOIN animalMilestones_Table ON animals_Table.animalID=animalMilestones_Table.animalID AND animalMilestones_Table.milestoneType="Intake"

答案 2 :(得分:0)

也许下面的代码适合你。

SELECT
   *
FROM
   animals_table at
LEFT JOIN animalmilestones_table amt ON at.animalID = amt.animalID AND amt.milestoneType = "Intake"

请试一试,然后告诉我它是怎么回事。

答案 3 :(得分:0)

试试这个

SELECT animals_Table.animalID, animalMilestones_Table.milestoneType
FROM animals_Table
LEFT JOIN (SELECT milestoneType
FROM animalMilestones_Table
WHERE milestoneType = "Intake") as animalMilestones_Table
ON animals_Table.animalID = animalMilestones_Table.animalID;

答案 4 :(得分:0)

如果没有记录,

animalMilestones_Table.milestoneType将为NULL。您需要检查它是否为NULL或您要查询的值。

animalMilestones_Table.milestoneType="Intake" or animalMilestones_Table.milestoneType is null

不确定Accesss中的确切SQL语法

答案 5 :(得分:0)

尝试以下查询。希望这可以帮助你,让我知道这是否有帮助..

SELECT animals_Table.AnimalID, animalMilestones_Table.MileStoneType
FROM animals_Table LEFT JOIN animalMilestones_Table ON animals_Table.AnimalID = animalMilestones_Table.AnimalID
WHERE ((((animalMilestones_Table.MileStoneType)='Intake' Or (animalMilestones_Table.MileStoneType) like '*') Or (animalMilestones_Table.MileStoneType) Is Null)) ;

答案 6 :(得分:-1)

的作用:

SELECT animals_Table.animalID, animalMilestones_Table.milestoneType
FROM animals_Table
LEFT JOIN animalMilestones_Table ON animals_Table.animalID=animalMilestones_Table.animalID
AND animalMilestones_Table.milestoneType="Intake"

工作?