在SQL中使用公共密钥连接两个表/将列添加到原始列

时间:2015-04-05 15:40:15

标签: mysql

我确定这很简单,但谷歌搜索它会带来如何使用没有公共密钥。我有一列充满了公共密钥(在这种情况下是provider_num)

基本上我的第一张桌子(名为' s10')看起来像这样:

provider_num | provider_name | state | phone_number`

10001        | johns creek   | ga    | 555-5555`

,第二个是这样的(称为' hs')

provider_num | latitude | longitude | IDS_num

10001        | -89.0023 | -82.4729  | stn0021

我想结束一张看起来像这样的桌子

provider_num | provider_name | state | phone_number | latitude | longitude | IDS_num

这可能吗?

到目前为止,我刚刚编写了一个像这样的简单插入

INSERT INTO s10
hs.latitude, hs.longitude, hs.IDS_num
where s10.provider_num = hs.provider_num

但我想在运行之前知道我是否遗漏了某些东西,例如s10中的预定义列等。

提前致谢

2 个答案:

答案 0 :(得分:3)

您不能同时在s10中创建列,并在同一SQL语句中填充它们的值。您首先需要ALTER TABLE添加列,然后使用UPDATE(使用INNER JOIN)填充列:

-- s10 already exists, but with limited columns
-- Add the other columns (use the correct data types - I just guessed here)
ALTER TABLE s10
  ADD latitude DECIMAL(10,2) [NULL or other attrs],
  ADD longitude DECIMAL(10,2) [NULL or other attrs],
  ADD IDS_num VARCHAR(32);

添加相关列后,使用联接(using the "multi-table" syntax described in the documentation)执行UPDATE

UPDATE s10 INNER JOIN hs ON s10.provider_num = hs.provider_num
  SET 
    s10.latitude = hs.latitude,
    s10.longitude = hs.longitude,
    s10.IDS_num = hs.IDS_num;

另一种解决方案是将这两个表保持原样并创建一个查询它们的视图:

CREATE VIEW combined_tables AS (
  SELECT
    s10.provider_num,
    provider_name,
    state,
    phone_number,
    latitude,
    longitude,
    IDS_num
  FROM 
   s10 
   INNER JOIN hs ON s10.provider_num = hs.provider_num
);

但如果hs仅包含provider_num标识的实体的其他属性,则通过将hs两者合并到s10来删除CREATE TABLE AS SELECT表格是有意义的。

另一个替代方法是使用SELECT通过查询其他表(在视图中使用相同的CREATE TABLE s10_combined AS SELECT s10.provider_num, provider_name, state, phone_number, latitude, longitude, IDS_num FROM s10 INNER JOIN hs ON s10.provider_num = hs.provider_num; )来创建新表:

s10_combined

上面会生成一个新表ALTER,之后您可以删除另外两个表UPDATE。考虑到所有这些替代方案,我会坚持使用第一个并执行{{1}}后跟{{1}}。

答案 1 :(得分:0)

您可以使用CREATE TABLE x AS SELECT声明。在你的情况下:

CREATE TABLE newtablename AS
SELECT the-fields-you-want FROM s10 INNER JOIN hs ON s10.provider_num = hs.provider_num

然后你可以删除原来的两个表并按照你喜欢的方式重命名新创建的表。并且不要忘记在新表上创建必要的索引。