【问题标题】:SQL Error: ambiguous column nameor syntax error [closed]SQL错误:不明确的列名或语法错误[关闭]
【发布时间】:2020-07-05 12:45:50
【问题描述】:

多次尝试更改我的代码,请帮助解决这些错误! 结果:列名不明确:main.Guides.Guide_ID

SELECT * 
FROM Guides 
INNER JOIN Guides ON Guides_Countries.Guide_ID = Guides_Countries.Guide_ID
INNER JOIN Countries ON Countries.Country_ID = Guides_Countries.Country_ID
INNER JOIN Guides_Languages ON Guides.Guide_ID = Guides_Languages.Guide_ID
INNER JOIN Languages ON Languages.Language_ID = Guides_Languages.Language_ID
WHERE Countries.Name="Kazakhstan" AND (Languages.Name="German" OR Languages.Name="English") AND Guides.Guide_ID NOT IN 
(SELECT Guide_ID
    FROM GuidesUnavailableDates
    INNER JOIN GuidesUnavailableDates ON GuidesUnavailableDates.UnDate_G_ID=Guides_UnDate.UnDate_G_ID
    WHERE (Start_date<="21/06/2020" and End_date>="21/06/2020")
    OR (Start_date<="30/06/2020" and End_date>="30/06/2020")
    OR (Start_date>="21/06/2020" and End_date<="30/06/2020")
    )
;

【问题讨论】:

  • FROM Guides INNER JOIN Guides ON Guides_Countries.Guide_ID = Guides_Countries.Guide_ID?检查表的名称。
  • 还是一样的问题
  • FROM Guides INNER JOIN Guides_Countries ON Guides.Guide_ID = Guides_Countries.Guide_ID
  • 您的代码没有意义,因为我们对您使用的表和要求一无所知。

标签: sql database sqlite


【解决方案1】:

您的FROM 子句中有多个表名多次出现。这导致了你的问题。我想你想要:

SELECT * 
FROM Guides g JOIN
     Guides_Countries gc
     ON gc.Guide_ID = g.Guide_ID JOIN
     Countries c
     ON c.Country_ID = gc.Country_ID JOIN
     Guides_Languages gl
     ON g.Guide_ID = gl.Guide_ID JOIN
     Languages l
     ON l.Language_ID = gl.Language_ID
WHERE c.Name = 'Kazakhstan' AND
      l.Name IN ('German', 'English') AND 
      g.Guide_ID NOT IN (SELECT gud.Guide_ID
                         FROM GuidesUnavailableDates gud
                         WHERE gud.Start_date <= '2020-06-30' AND
                               gud.End_date >= '2020-06-21'
                        );

注意事项:

  • Guide_Countries 不在您的 FROM 列表中,尽管 Guides 出现了两次。
  • IN 比多个 ORs 简单得多。
  • 所有列都是合格的,因此很清楚它们来自哪个表。
  • 所有表都有简单的表别名,它们是表名的缩写。
  • 子查询中不需要JOIN
  • 使用格式正确的日期。
  • 我猜奇怪的日期逻辑是为了找到与提到的时间段的重叠,所以我简化了逻辑。 (你没有解释逻辑,所以这是一个猜测,你的原始代码没有意义。)
  • 我强烈建议对子查询使用NOT EXISTS 而不是NOT IN。但是,我没有更改这里的代码(主要是因为我无法确定子查询应该做什么)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2018-10-23
    相关资源
    最近更新 更多