亚洲av成人精品日韩一区,97久久久精品综合88久久,玩弄japan白嫩少妇hd,亚洲av片不卡无码久久,玩弄人妻少妇500系列

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

傳感器之外—兩個(gè)數(shù)據(jù)庫之間的“連接”查詢

安費(fèi)諾傳感器學(xué)堂 ? 來源:安費(fèi)諾傳感器學(xué)堂 ? 2024-03-12 14:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

年后的小編在寫一些代碼,沒有及時(shí)更新我們的公眾號,干脆,先把其中涉及到數(shù)據(jù)庫的的一些操作,尤其是不同數(shù)據(jù)庫,多個(gè)表的“連接”查詢的操作過程小結(jié)一下供各位參考。畢竟今天這個(gè)數(shù)據(jù)時(shí)代,大量數(shù)據(jù)的處理都離不開數(shù)據(jù)庫這個(gè)工具。

說到數(shù)據(jù)庫,它不僅是我們大量數(shù)據(jù)有序存儲的地方,更是一種提供各種數(shù)據(jù)的匯總計(jì)算、組合統(tǒng)計(jì)的高效工具。換句話說,就是數(shù)據(jù)庫存儲數(shù)據(jù)不是主要目的,更重要的是怎么使用這些數(shù)據(jù)。

當(dāng)我們的重要數(shù)據(jù)要存入數(shù)據(jù)庫時(shí),一般不會把所有的數(shù)據(jù)關(guān)聯(lián)的特性都定義并放到一個(gè)表里,所以會存在多個(gè)表,而存在關(guān)聯(lián)的表之間在查詢數(shù)據(jù)時(shí)就會產(chǎn)生多表連接(join)查詢。

舉個(gè)書店和客戶用數(shù)據(jù)庫的簡單栗子。比如客戶的信息和客戶的訂單。

(1)從數(shù)據(jù)保存的角度來看,完全沒必要在每個(gè)訂單中把客戶的詳細(xì)信息再跟著書本訂單進(jìn)行重復(fù)保存(1是影響存儲空間——在我們國家有些村的地址寫下了的話,可以成一本書了,2是如果客戶信息有調(diào)整時(shí),不希望把所有的訂單信息也要跟著改變),所以出現(xiàn)了兩個(gè)表;

(2)從信息輸出的角度而言,當(dāng)我們要了解一個(gè)訂單時(shí),卻希望同時(shí)知道客戶和貨物書本的詳情。這個(gè)時(shí)候就需要同時(shí)用到兩個(gè)表的數(shù)據(jù),對于數(shù)據(jù)庫的操作就要進(jìn)行多表連接查詢。

表-1:Customer

CustomerID CustomerName
1 John Doe
2 Jane Doe
3 Max Smith

表-2:Order

OrderID CustomerID Book Amount
2 1 Book1 200
3 2 Book2 150
4 3 Book3 300

那么,查詢訂單的詳情,用sql實(shí)現(xiàn)的方式如下:

select A.CustomerName, B.book, B.Amount from
Customer A
Left join Order B
where A.CustomerID=B.CustomerID

剛剛的sql中用到的Left Join連接查詢方式,是以表Customer為主。如果在Order中沒有對應(yīng)客戶的CustomerID,那么對應(yīng)Order部分的數(shù)據(jù)在輸出結(jié)果中為空(NULL)。輸出結(jié)果是:

CustomerName Book Amount
John Doe Book1 200
Jane Doe Book2 150
Max Smith Book3 300

而如果上面sql用Right Join,那么以O(shè)rder為主,輸出的查詢結(jié)果中Order部分都會輸出,而Customer這部分字段如果沒有對應(yīng)的訂單,則為空(NULL)。

如果使用Inner Join,則是以所有連接表都有對應(yīng)記錄的數(shù)據(jù)會隨查詢輸出。簡單的示意圖如下所示。

09ad0d38-e03d-11ee-a297-92fbcf53809c.png

簡單的栗子如上所述。結(jié)合題目,我們提供一下這次的情景設(shè)定:

要整合兩個(gè)數(shù)據(jù)庫的數(shù)據(jù),一個(gè)是Oracle,一個(gè)是Postgresql(PG)

在PG中保存了和貨物相關(guān)的信息

前者只讀,后者可讀寫,應(yīng)用要求將Oracle中的查詢結(jié)果和PG中的和貨物相關(guān)的表的信息進(jìn)行合并

在PG中和貨物相關(guān)的兩個(gè)表分別是書的作者(Author),書的出版社(Publisher)

合并后的結(jié)果寫入到PG的bookinfo表中

先要說明:兩個(gè)獨(dú)立的數(shù)據(jù)庫之間是無法使用表之間的連接(join)查詢的。我們直接提供解決方法:就是使用PG的臨時(shí)表功能(其他數(shù)據(jù)庫當(dāng)然也有,物理的或者內(nèi)存方式的)——TEMPLATE TABLE

基本的思路步驟如下:

查詢Oracle中的數(shù)據(jù)

根據(jù)(1)的結(jié)果中的字段,在PG中建臨時(shí)表

因?yàn)橛辛伺R時(shí)表,在PG中可以和其他的表進(jìn)行連接查詢

查詢的結(jié)果再寫入PG中

這里我們使用Python來實(shí)現(xiàn)相應(yīng)的功能。示例中的表定義并不合理,大家關(guān)注的應(yīng)該是實(shí)現(xiàn)過程。

查詢Oracle的數(shù)據(jù)

importcx_Oracle#Oracle的python擴(kuò)展包
importpsycopg2#PostgreSQL數(shù)據(jù)庫的適配器
frompsycopg2 import extras


#Oracleconnection& cursor
oracle_connection = cx_Oracle.connect('username', 'password', 'hostname:port/servicename')
oracle_cursor = oracle_connection.cursor()


oracle_query="""
selectA.CustomerName,B.Goods,B.Amount
fromCustomerALeftjoinOrderB
whereA.CustomerID=B.CustomerID
"""


oracle_cursor.arraysize=1000       # 準(zhǔn)備多次讀取
oracle_cursor.execute(oracle_query)    # Run query


# PG的連接和cursor
# 連接到 PostgreSQL 數(shù)據(jù)庫
pgsql_conn = psycopg2.connect(database="mydatabase", user="myuser", password="mypassword", host="localhost", port="5432")
pgsql_cursor = pgsql_conn.cursor()  


#準(zhǔn)備好PG數(shù)據(jù)中插入數(shù)據(jù)的cursor和sql
#假設(shè)pg的數(shù)據(jù)庫中已經(jīng)建好了需要的表,這個(gè)是為例避免在下面的示例代碼中
#的循環(huán)中出現(xiàn)這些需要額外的參數(shù)定義
#=======================================
pg_insert_query="""
"INSERTINTObook_info(
customername,bookname,amount,authorname,publishername)
VALUES(%s,%s,%s,%s,%s)"
"""
#第二個(gè)PG數(shù)據(jù)庫的cursor,用于數(shù)據(jù)插入操作,以區(qū)別于連接操作的cursor
pg_insert_cursor = pgsql_conn.cursor()


#準(zhǔn)備臨時(shí)表刪除用的sql
drop_table_query = "DROP TABLE IF EXISTS temp_table"
#=======================================

下面的操作都是在一個(gè)循環(huán)中完成,就不分段了。

在PG建臨時(shí)表

將Oracle中查詢的數(shù)據(jù)寫入到PG的臨時(shí)表

PG內(nèi)的多表連接查詢(間接的方式與Oracle查詢結(jié)果進(jìn)行連接查詢)

將查詢結(jié)果寫到PG的bookinfo表中

whileTrue:
  # 通過 fetchmany 獲取一批數(shù)據(jù)
  rows = oracle_cursor.fetchmany()
ifnotrows:#結(jié)束查詢Oracle
    break
else:
#表中的名稱和字段特性的定義需要和后面的數(shù)據(jù)插入操作一致
# 注意關(guān)鍵詞:TEMPORARY TABLE
  pgsql_cursor.execute("""
      CREATE TEMPORARY TABLE temp_table(
      CustomerName type1,
      Book   type2,
      Amount type3
      );
    #和平時(shí)建表時(shí)相同,需要提交,每輪操作建立臨時(shí)表后還需要?jiǎng)h除
pgsql_conn.commit()

#將查詢的Oracle中的數(shù)據(jù)寫入臨時(shí)表temp_table
#extras的使用會更高效
  extras.execute_values(
        pgsql_cursor, 
"INSERTINTOtemp_table(CustomerName,Book,Amount) VALUES %s", 
rows)
    # 提交變更
    pgsql_conn.commit()
    
#PG中多表查詢,包括temp_table
SQL="""
SELECTtemp_table.*,author.name,publisher.name
fromtemp_table
leftjoinauthoronauthor.book=temp_table.book
leftjoinpublisheronpublisher.book=temp_table.book
"""

pgsql_cursor.execute(SQL)
#循環(huán)讀取連接查詢的結(jié)果,并保存到PG的另外一個(gè)表中:bookinfo
for rcd in pgsql_cursor:
pg_insert_cursor.execute(pg_insert_query,(rcd))

#在for循環(huán)結(jié)束后,提交數(shù)據(jù)的寫入
    pgsql_conn.commit()
    
#刪除臨時(shí)表,準(zhǔn)備下一次while循環(huán)
pgsql_cursor.execute(drop_table_query )
#提交變更,以刪除temp_table>>>注意提交對應(yīng)的execute
pgsql_conn.commit()#然后再進(jìn)入下一個(gè)while循環(huán)

以上的表及表中定義僅為示例,實(shí)際數(shù)據(jù)庫中會有更為復(fù)雜的關(guān)聯(lián)。




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2565

    文章

    52999

    瀏覽量

    767392
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    783

    瀏覽量

    45144
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3926

    瀏覽量

    66218
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86738

原文標(biāo)題:傳感器之外—兩個(gè)數(shù)據(jù)庫之間的“連接”查詢

文章出處:【微信號:安費(fèi)諾傳感器學(xué)堂,微信公眾號:安費(fèi)諾傳感器學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    求助關(guān)于labview查詢access數(shù)據(jù)庫的問題

    初學(xué)者,想學(xué)習(xí)鏈接數(shù)據(jù)庫方面的知識,遇到不少問題,下面求助各位大神,關(guān)于查詢數(shù)據(jù)庫的問題問題:如何通過“零部件名稱”“故障模式”查詢數(shù)據(jù)庫
    發(fā)表于 03-14 21:18

    數(shù)據(jù)庫查詢

    數(shù)據(jù)庫查詢
    發(fā)表于 10-06 16:06

    查詢數(shù)據(jù)庫的最完美技巧

    查詢數(shù)據(jù)庫的最完美技巧.rar
    發(fā)表于 03-15 14:15 ?24次下載

    JAVA數(shù)據(jù)庫連接:JDBC*

    實(shí)驗(yàn)13 數(shù)據(jù)庫連接:JDBC*一、實(shí)驗(yàn)?zāi)康?了解JDBC核心API,利用JDBC核心API,建立數(shù)據(jù)庫連接、執(zhí)行SQL語句、取得查詢集、
    發(fā)表于 09-23 19:06 ?1752次閱讀

    數(shù)據(jù)庫查詢優(yōu)化方法的研究與探索

    SQL是一種數(shù)據(jù)庫查詢和程序設(shè)計(jì)語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng)。不同的實(shí)現(xiàn)方法之間
    發(fā)表于 08-08 14:43 ?0次下載

    JAVA教程之查詢數(shù)據(jù)庫

    JAVA教程之查詢數(shù)據(jù)庫,很好的JAVA的資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-12 17:49 ?6次下載

    KingSCADA查詢數(shù)據(jù)庫說明文檔

    2005 數(shù)據(jù)庫為例,展示在KingSCADA3.0 中怎樣查詢關(guān)系數(shù)據(jù)庫中的信息。 以下介紹種配置數(shù)據(jù)驅(qū)動(dòng)接口方式,這
    發(fā)表于 10-24 11:17 ?16次下載
    KingSCADA<b class='flag-5'>查詢</b><b class='flag-5'>數(shù)據(jù)庫</b>說明文檔

    基于Greenplum數(shù)據(jù)庫查詢優(yōu)化

    估算查詢代價(jià);然后,采用并行最大最小蟻群算法來搜索具有最小查詢代價(jià)的連接順序,即最優(yōu)連接順序;最后,根據(jù)Greenplum數(shù)據(jù)庫
    發(fā)表于 03-29 17:46 ?0次下載

    關(guān)系型數(shù)據(jù)庫表結(jié)構(gòu)的設(shè)計(jì)有什么技巧?兩個(gè)設(shè)計(jì)技巧詳細(xì)說明

    關(guān)系型數(shù)據(jù)庫表結(jié)構(gòu)的設(shè)計(jì),有下面兩個(gè)設(shè)計(jì)技巧: 物理主鍵作為關(guān)聯(lián)的外鍵 關(guān)系型數(shù)據(jù)庫,由多個(gè)數(shù)據(jù)表構(gòu)成。每一個(gè)數(shù)據(jù)表的結(jié)構(gòu)是相同的,不同
    發(fā)表于 10-16 10:33 ?13次下載

    張表之間進(jìn)行數(shù)據(jù)庫查詢時(shí)聚合函數(shù)用法的詳細(xì)實(shí)例說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是張表之間進(jìn)行數(shù)據(jù)庫查詢時(shí)聚合函數(shù)用法的詳細(xì)實(shí)例說明。注意:表中內(nèi)容中文顯示時(shí)有亂碼現(xiàn)象,我都用Hello World代替!
    發(fā)表于 04-29 18:24 ?0次下載
    <b class='flag-5'>兩</b>張表<b class='flag-5'>之間</b>進(jìn)行<b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>查詢</b>時(shí)聚合函數(shù)用法的詳細(xì)實(shí)例說明

    數(shù)據(jù)庫插入查詢刪除操作教程

    數(shù)據(jù)庫插入查詢刪除操作教程
    發(fā)表于 12-07 09:57 ?2次下載

    Devart:如何通過跨多個(gè)數(shù)據(jù)庫自動(dòng)執(zhí)行數(shù)據(jù)庫腳本來節(jié)省時(shí)間和減少錯(cuò)誤

    腳本已經(jīng)成功執(zhí)行,并且已經(jīng)在目標(biāo)數(shù)據(jù)庫中創(chuàng)建了Users表。如果使用dbForgeStudio for SQL Server對多個(gè)數(shù)據(jù)庫運(yùn)行腳本,該工具將為每個(gè)數(shù)據(jù)庫打開單獨(dú)的SQL文檔。這允許您確認(rèn)
    的頭像 發(fā)表于 04-06 09:49 ?1097次閱讀

    python讀取數(shù)據(jù)庫數(shù)據(jù) python查詢數(shù)據(jù)庫 python數(shù)據(jù)庫連接

    python讀取數(shù)據(jù)庫數(shù)據(jù) python查詢數(shù)據(jù)庫 python數(shù)據(jù)庫連接 Python是一門高
    的頭像 發(fā)表于 08-28 17:09 ?2220次閱讀

    mysql怎么新建一個(gè)數(shù)據(jù)庫

    mysql怎么新建一個(gè)數(shù)據(jù)庫 如何新建一個(gè)數(shù)據(jù)庫在MySQL中 創(chuàng)建一個(gè)數(shù)據(jù)庫是MySQL中的基本操作之一。下面將詳細(xì)介紹在MySQL中如何新建一個(gè)數(shù)據(jù)庫。 在MySQL中創(chuàng)建
    的頭像 發(fā)表于 12-28 10:01 ?1277次閱讀

    Looker Studio連接器:一個(gè)連接器從多個(gè)數(shù)據(jù)庫和云應(yīng)用獲取數(shù)據(jù)

    本地數(shù)據(jù)連接器 通過 Skyvia Agent 應(yīng)用程序輕松將 Looker Studio(前身為 Google Data Studio)連接到本地數(shù)據(jù)庫。無需將
    的頭像 發(fā)表于 01-03 09:07 ?650次閱讀
    Looker Studio<b class='flag-5'>連接器</b>:一個(gè)<b class='flag-5'>連接器</b>從多<b class='flag-5'>個(gè)數(shù)據(jù)庫</b>和云應(yīng)用獲取<b class='flag-5'>數(shù)據(jù)</b>