當前位置:首頁 » 編程語言 » sql怎麼排查邏輯問題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql怎麼排查邏輯問題

發布時間: 2023-07-01 04:03:29

① 檢查資料庫中數據的邏輯完整性,怎麼寫sql語句

SQL是Structured Query Language(結構化查詢語言)的縮寫。SQL是專為資料庫而建立的操作命令集,是一種功能齊全的資料庫語言。在使用它時,只需要發出「做什麼」的命令,「怎麼做」是不用使用者考慮的。SQL功能強大、簡單易學、使用方便,已經成為了資料庫操作的基礎,並且現在幾乎所有的資料庫均支持SQL。

② C#sql從資料庫中讀取邏輯值

連接資料庫並從資料庫中獲取數據一般的操作。
1.創建一個SqlConnection對象,該對象用來連接資料庫,該對象有一個connectString屬性,描述了資料庫的連接字元串。說明了要連接的資料庫以及訪問資料庫的方式(如驗證方式、用戶名、密碼等信息)。設置好connectString後,就可以使用該對象的Open()方法,連接上資料庫。
2.創建一個SqlCommand,該對象的作用是:表示要對SQLServer資料庫執行的一個Transact-SQL語句或存儲過程。該對象有個Connection,通過該屬性可以設置或獲取實例使用的SqlConnection。要使用SqlCommand前,需要設置這個Connection屬性。可以把第1步創建的SqlConnection實例賦給該屬性SqlCommand還有一個commandText屬性:獲取或設置要對數據源執行的Transact-SQL語句、表名或存儲過程。這個字元串代表要對資料庫中的表要做的查詢等操作SqlCommand有一系列的執行方法。
3。SqlDataAdapter類:表示用於填充DataSet和更新SQLServer資料庫的一組數據命令和一個資料庫連接。該類有個SelectCommand屬性:獲取或設置一個Transact-SQL語句或存儲過程,用於在數據源中選擇記錄。可以把第二步創建的SqlCommand對象設置給該屬性。該屬性也可以在構造函數中作為參數傳遞進來。調用該類的Fill方法可以將查到的數據填充到DataSet中或者DataTable中
連接資料庫
this.OpenSqlConnection(connectionString);
查詢資料庫中是否有數據,如果有,清空表。
stringcmdString="select'學號'=StudentNumber,'姓名'=Name,'年齡'=Age,'性別'=SexfromStudents";
//創建SqlCommand對象,sqlcommand表示要對SQLServer資料庫執行的一個Transact-SQL語句或存儲過程
SqlCommandcmd=newSqlCommand(cmdString);
cmd.Connection=connec;
SqlDataAdapter表示用於填充DataSet和更新SQLServer資料庫的一組數據命令和一個資料庫連接。
SqlDataAdapterada=newSqlDataAdapter(cmd);
DataSetset=newDataSet();
ada.Fill(set);

③ 一次sparksql問題排查記錄

問題: 在調試一個sparksql左連接查詢時發現數據結果不正確,經過一天折騰才發現使用子查詢方式能夠得到正確的結果,分析執行計劃發現第一種寫法的優化後的執行計劃將where t.ip is null and t.dn條件錯誤的加到了左表子查詢中了,即紅色標出的地方,這樣導致左表子查詢查不出數據來。

結論: 過濾條件寫在where條件中時,spark會將sql優化為inner join, 如果連接條件中的欄位出現在最後的where條件中,那麼該條件在做謂詞下推時也會被加到左表和右表中,此時就不符合預拍鬧期結果,即會導致左表中的查不到預期的數據,但是將過濾數據用的限定條件寫到子查詢中時查出的結果是正確的,執行計劃也是正確的,原因不詳,懷疑碧告是spark執行計劃優化中的bug;襲慧罩

過程數據記錄
1、條件在where中
select
oneday.dn, oneday.ip, �', �'
from
(
select
ip,dn
from dwd_dns.t_ip_dn_his_rel2
where dt = �'
group by ip,dn
) oneday left join dwd_dns.t_ip_dn_first t on t.ip = oneday.ip and t.dn = oneday.dn
where t.ip is null and t.dn is null and t.dt = �'

執行計劃:

== Optimized Logical Plan ==
InsertIntoHiveTable dwd_dns . t_ip_dn_first , org.apache.hadoop.hive.ql.io.orc.OrcSerde, Map(dt -> None), true, false, [dn, ip, first_time, dt]
+- Project [dn#1, ip#2, 20201202 AS first_time#28, 20201202 AS dt#29]
+- Join Inner, ((ip#8 = ip#2) && (dn#7 = dn#1))
:- Aggregate [ip#2, dn#1], [ip#2, dn#1]
: +- Project [dn#1, ip#2]
: +- Filter (((((isnotnull(dt#6) && (dt#6 = 20201202)) && isnull(dn#1)) && isnull(ip#2)) && isnotnull(ip#2)) && isnotnull(dn#1))
: +- Relation[uid#0,dn#1,ip#2,cname#3,dnsip#4,probe_time#5,dt#6] orc
+- Project [dn#7, ip#8]
+- Filter (((((isnotnull(dt#10) && isnull(ip#8)) && isnull(dn#7)) && (dt#10 = 20201001)) && isnotnull(ip#8)) && isnotnull(dn#7))
+- Relation[dn#7,ip#8,first_time#9,dt#10] orc

2、條件在子查詢中
select
/ + REPARTITION(10) /
oneday.dn, oneday.ip, �', �'
from
(
select
ip,dn
from dwd_dns.t_ip_dn_his_rel2
where dt = �'
group by ip,dn
) oneday left join
(
select dn, ip
from
dwd_dns.t_ip_dn_first
where dt = �'
) t on t.ip = oneday.ip and t.dn = oneday.dn
where t.ip is null and t.dn is null

執行計劃:

== Optimized Logical Plan ==
InsertIntoHiveTable dwd_dns . t_ip_dn_first , org.apache.hadoop.hive.ql.io.orc.OrcSerde, Map(dt -> None), true, false, [dn, ip, first_time, dt]
+- Project [dn#1, ip#2, 20201202 AS first_time#28, 20201202 AS dt#29]
+- Repartition 10, true
+- Project [dn#1, ip#2]
+- Filter (isnull(ip#8) && isnull(dn#7))
+- Join LeftOuter, ((ip#8 = ip#2) && (dn#7 = dn#1))
:- Aggregate [ip#2, dn#1], [ip#2, dn#1]
: +- Project [dn#1, ip#2]
: +- Filter (isnotnull(dt#6) && (dt#6 = 20201202))
: +- Relation[uid#0,dn#1,ip#2,cname#3,dnsip#4,probe_time#5,dt#6] orc
+- Project [dn#7, ip#8]
+- Filter (((isnotnull(dt#10) && (dt#10 = 20201001)) && isnotnull(ip#8)) && isnotnull(dn#7))
+- Relation[dn#7,ip#8,first_time#9,dt#10] orc

④ 一條簡單的SQL關聯,邏輯問題.

這個肯定是對的,不對我給你分
select b.name,sum(a.cun),sum(a.qu) from
(
select id,sum(cunkuanmoney) as cun ,0 as qu from 存款表 group by id
union all
select id,0 as cun ,sum(qukuanmoney) as qu from 取款表 group by id

) a,信息表 b where a.id=b.id group by b.id,b.name

⑤ sql邏輯查詢

賬號和客戶 應該分別是不同的表吧,客戶信息一張表,賬號信息一張表,如果是在同一張表裡 ,這個表邏輯好像就有點問題。

select
*
fromtable1
wherecust_csnoin
(selectcust_csno
from
table1
groupbycust_csnohavingcount(account_no)>=4)

⑥ 復雜的邏輯寫到一個sql語句中,求助已解決

關於題主問題其實同屬性(欄位)使用與邏輯進行等值運算要講清楚我首先弄清楚與邏輯內涵與邏輯表示邏輯運算符and兩邊表達式都立真至少立即假面用MySQL實驗說明: 先創建物表插入狗貓兩條記錄 圖" class="illustration_alink"> 先篩選即狗貓記錄(使用與邏輯)返結二 select * from animal where animal='dog' and animal='cat'; 圖" class="illustration_alink"> 看返空記錄集物能同狗貓 跟著再看看 篩選即狗狗記錄(使用與邏輯)返結三 select * from animal where animal='dog' and animal='dog'; 圖" class="illustration_alink"> 結返條狗記錄物狗狗盡管講啰嗦邏輯沒問題記錄返看吧同屬性使用與邏輯等值運算種做些畫蛇添足 看看 篩選狗或者貓記錄(使用或邏輯)返結四 select * from animal where animal='dog' or animal='cat'; 圖" class="illustration_alink"> 結返兩條記錄要物狗或者貓篩選表貓狗都都篩選 至於自連接同屬性使用與邏輯等值運算要自連接表至少取別名系統才能所區至於弄混淆連接各表記錄行欄位自連接數據源同張表資料庫引擎實際其復制內存變內容致兩張虛擬表實施連接運算例例使用自連接選t一每itemvalue值: select a.item,a.value  from t一 a where not exists( select 一 from t一 b  where b.item=a.item and b.value>a.value);