【问题标题】:How to select two values in one row?如何在一行中选择两个值?
【发布时间】:2020-02-28 11:12:38
【问题描述】:

似乎非常基本,但我找不到优雅的解决方案。我有两张 SQL 表,一张包含用户,另一张包含城市。第三个表包含前两个表之间的匹配项(两个外键指向每个表的 PK。)

我想在第三个表中添加一个项目,告诉用户 Jeff 住在马萨诸塞州波士顿。

现在,我就是这样做的:

INSERT INTO users_countries
SELECT user_id, city_id FROM
(
    SELECT TOP 1 user_id
    FROM users
    WHERE name = 'Jeff' AND ...
) a JOIN
(
    SELECT TOP 1 city_id
    FROM cities
    WHERE name = 'Boston' AND ...
) b ON 1 = 1;

虽然可以完成这项工作,但它看起来一点也不优雅。

编写此查询的更好方法是什么?

【问题讨论】:

    标签: sql sql-server tsql join sql-insert


    【解决方案1】:

    我认为更典型的方法是:

    INSERT INTO users_countries (user_id, city_id)
        SELECT user_id, city_id
        FROM users u JOIN
             cities c
             ON u.name = 'Jeff' AND 
                c.name = 'Boston' ;
    

    这不应返回重复项。但是如果你想保证一行,那么在SELECT中使用SELECT TOP (1)

    【讨论】:

      【解决方案2】:

      不要加入 2 个不相关的表。
      您想向包含 2 个完全不相关的值的表添加新行。
      您正在寻找优雅,而您应该首先寻找效率。
      为什么要使用联接?即使那样,为什么 INNER 加入而 CROSS 加入不需要设置任何条件?
      我会使用VALUES 而不是SELECT 和完全不必要的JOIN

      INSERT INTO users_countries(user_id, city_id) VALUES
      (
        (
          SELECT TOP 1 user_id FROM users
          WHERE name = 'Jeff' AND ...
        ),
        (
          SELECT TOP 1 city_id FROM cities
          WHERE name = 'Boston' AND ...
        )
      );
      

      查看简化的demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        相关资源
        最近更新 更多