仅使用SELECT,FROM和WHERE命令从多个表中选择?

时间:2019-04-21 14:44:16

标签: sql relational-database

过去的试卷中有关医院的SQL /数据库问题涉及两个表:

  • 一个Patient表,列出了他们当前分配的病房的姓氏,姓氏和ID。
  • 一个Ward表,其中列出了病房ID和名称以及其他常规属性。

问题如下:

“使用SQL命令SELECTFROMWHERE,编写一条SQL语句以查询数据库表中维多利亚病房所有患者的姓氏,姓氏和医疗状况编号。”

所以我需要

SELECT forename, surname, condition 
FROM patients 
WHERE ward == "Victoria"

但这是不可能的,因为患者没有ward属性,只有wardID,并且出于这个问题,我们假设我们不知道“维多利亚”病房。

因此,我需要选择Patient.WardID对应于“维多利亚”的Ward.WardID的每个患者,而不使用INNER JOIN,根据我的阅读,我认为这是正常的方法为此。

我该怎么做?谢谢

编辑:我最初制作了这个,但是我认为这是不正确的。

SELECT patient.forename, patient.surname, patient.condition 
FROM patient, ward 
WHERE patient.WardID = ward.WardID 
  AND Ward.name == "Victoria"

2 个答案:

答案 0 :(得分:1)

您可以使用相关子查询来查找病房名称:

@Test
public void test2 () throws Exception {
    Class<?> klass = new ByteBuddy()
            .subclass(Alpha.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)
            .implement(Indexed.class)

            .defineConstructor(Visibility.PUBLIC)
            .withParameters(Alpha.class, Long.class)
            .intercept(

                    // Invoke Objects default constructor explicitly
                    MethodCall.invoke(Object.class.getConstructor())

                    .andThen(FieldAccessor.ofField("origin").setsArgumentAt(0))
                    .andThen(FieldAccessor.ofField("index").setsArgumentAt(1)))

            .defineProperty("origin", Alpha.class, true)

            .method(ElementMatchers.anyOf(Alpha.class.getMethods()))
            .intercept(MethodCall.invokeSelf().onField("origin").withAllArguments())

            .defineProperty("index", Long.class, true)

            .make()
            .load(AlphaImpl.class.getClassLoader())
            .getLoaded();

    Alpha origin = new AlphaImpl("Wrapped object", 10L);
    Alpha indexed = (Alpha) klass.getConstructor(Alpha.class, Long.class).newInstance(origin, 13L);

    assertEquals("Wrapped object", indexed.getName());
    assertEquals(10L, (long)indexed.getRating());
    assertEquals(13L, (long)((Indexed)indexed).getIndex());
}

我在查询中引入了表别名,以使其更加简洁和易于阅读。但是请注意,使用内部联接编写查询可能是首选的方法,也是执行效果最好的方法。您应该将这个问题视为一个难题,以查看您的SQL是否足够灵活。

答案 1 :(得分:1)

您可以使用联接

  SELECT
      p.forename
      p.surname,
      p.condition
  FROM patient p
  INNER JOIN ward w ON p.WardID = w.WardID 
    AND w.name = 'Victoria'

显式请求的位请记住,联接等效于where条件..如果您不希望联接..您可以简单地使用旧的(1992年以前的版本)SQL sintax

 SELECT
      p.forename
      p.surname,
      p.condition
  FROM patient p, ward w
  WHERE p.WardID = w.WardID 
    AND w.name = 'Victoria'