【问题标题】:SQL: SELECT table and include field/value from another tableSQL:选择表并包含另一个表中的字段/值
【发布时间】:2018-10-18 04:22:57
【问题描述】:

我想要完成的是从一个表中选择不同的值,并从另一个表中包含一个字段值(将从另一个表中选择)。

这是我的陈述的一个例子:

SELECT table1.Foo, <- ID
       table1.Bar, <- some value
       (SELECT table2.Baz from table2 <- another value I'd like to select from another table
        WHERE table1.Foo = table2.Foo and table2.Qux = 'A') As value1
FROM table1
INNER JOIN table2 ON table1.Foo = table2.Foo
WHERE table1.Bar = '2'

value1 是一个独特的值,这一点非常重要。抛出的错误是(value1 的)子查询包含多个值。

我想请你帮忙!

编辑:这里是一些示例数据

表1

|---------------------|------------------|
|         Foo         |       Bar        |
|---------------------|------------------|
|          1          |        ABC       |
|---------------------|------------------|
|          2          |        XYZ       |
|---------------------|------------------|

表2

|---------------------|------------------|------------------|
|         Foo         |        Baz       |       Qux        |
|---------------------|------------------|------------------|
|          1          |        100       |        A         |
|---------------------|------------------|------------------|
|          1          |        200       |        B         |
|---------------------|------------------|------------------|
|          2          |        150       |        A         |
|---------------------|------------------|------------------|
|          2          |        175       |        B         |
|---------------------|------------------|------------------|

结果

|---------------------|------------------|------------------|
|         Foo         |        Bar       |       value1     |
|---------------------|------------------|------------------|
|          1          |        ABC       |        100       |
|---------------------|------------------|------------------|
|          2          |        XYZ       |        150       |
|---------------------|------------------|------------------|

您好, 框架

【问题讨论】:

  • 添加一些示例表数据和预期结果。 (作为格式化文本,而不是图像。)
  • 那么如果该子查询将返回多条记录,那么您选择单个值的逻辑是什么?
  • 您是说“我有一个返回多个值的查询,如何让它只返回一个值?”好吧,需要指定如何操作的逻辑;你想要MIN()MAX()AVERAGE()、按时间戳列排序的第一个值,还是其他一些逻辑?最好的建议是举一个完全可论证的例子;带有您想要的结果的示例数据,表达您想要应用的规则。阅读以下内容可能会对您有所帮助:stackoverflow.com/help/mcve

标签: sql join subquery inner-join


【解决方案1】:

如果您使用subquery,则无需再次执行JOIN

select *,
       (select top 1 Baz from table2 where Foo = t1.Foo and Qux = 'A') as value1
from table1 t1;

如果不支持,请使用 LIMIT 子句代替 TOP

您可以将LIMIT 子句实现为

select *,
        (select Baz 
         from table2 
         where Foo = t1.Foo and 
               Qux = 'A' 
         order by Baz -- Use DESC if necessary 
         LIMIT 1) as value1
from table1 t1;

【讨论】:

  • 您的解决方案似乎有效(我尚未完全检查结果)。我不明白,我似乎找不到显示子查询的方法,是为什么在选择子查询时有多个记录
  • @Frame 然后在您的问题中解释为什么您希望只有一条记录。这只是为什么您应该在代码问题中始终给出minimal reproducible example 的另一个原因——它包括 DDL,其中包括有关数据的某些约束/假设。
【解决方案2】:

试试这个查询:

SELECT
    t1.Foo,
    t1.Bar,
    t2.Baz AS value1
FROM table1 t1
INNER JOIN table2 t2
    ON t1.Foo = t2.Foo
WHERE
    t2.Qux = 'A';

【讨论】:

  • 我想获取与 table1 中的记录具有相同 ID (Foo) 且 table2.Qux = 'A' 的 table2.Baz 值
  • @Frame 我更新了我的答案,但您的示例数据无法显示如果 table1 记录应该匹配多个 table2 记录会发生什么的逻辑。
  • 对于 table2 中的每个 ID,Qux 中有 3 个值包含“A”、“B”或“C”。因此,如果我添加 table2.Qux = 'A' 结果应该只是一条记录
  • 嗯...我的查询已经这样做了。你试过运行它了吗?
【解决方案3】:

您可以使用 SELECT DISTINCT 语句

SELECT DISTINCT table1.Foo, table1.Bar, (SELECT table2.Baz from table2 WHERE table1.Foo = table2.Foo and table2.Qux = 'A') As value1 FROM table1 INNER JOIN table2 WHERE table1.Foo = table2.Foo AND table1.Bar = '2'

【讨论】:

    猜你喜欢
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多