當前位置:首頁 » 編程語言 » sql表自關聯
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql表自關聯

發布時間: 2022-08-26 19:40:20

A. 已經建立了兩個表,請問如何用sql語句建立關聯

以下對ORACLE,SQL
SERVER等都適用:
自然連接(列名相同,只選相同列名下兩邊值相等的行):
SELECT
*
FROM
STUDENT
A
NATURAL
JOIN
SCORE
B
內連接(列名不一定相同,只選滿足ON條件的行):
SELECT
*
FROM
STUDENT
A
INNER
JOIN
SCORE
B
ON
A.SNO
=
B.SNO
左外連接(列名不一定相同,只選滿足ON條件的行和左表的全部,右表填充空值):
SELECT
*
FROM
STUDENT
A
LEFT
OUTER
JOIN
SCORE
B
ON
A.SNO
=
B.SNO
右外連接(列名不一定相同,只選滿足ON條件的行和右表的全部,左表填充空值):
SELECT
*
FROM
STUDENT
A
RIGHT
OUTER
JOIN
SCORE
B
ON
A.SNO
=
B.SNO
全外連接(列名不一定相同,只選滿足ON條件的行和兩邊表的全部,無匹配的全部填充空值)
SELECT
*
FROM
STUDENT
A
FULL
OUTER
JOIN
SCORE
B
ON
A.SNO
=
B.SNO
全連接(笛卡爾積,所有行和所有行交叉組合形成新表)
SELECT
*
FROM
STUDENT
A
CROSS
JOIN
SCORE
B

B. 有個人事表自關聯,sql語句怎麼寫

select id,name,老闆id,老闆名字
from 人事表 inner join 老闆表
on 人事表.老闆id = 老闆表.老闆id

C. 在寫SQL語句時什麼時候需要用到自表關聯,誰能舉個完整的例子

比如公司的部門結構,
人事部門,他的下級 考勤科,數據存儲在一個表中
org_code = 考勤科, up_org_code = 人事部門
,表名是人事 表,我需要查詢人事的上下級部門關系,則需要

select B.org_code, A.org_code
from 人事表 A, 人事表 B
where A.up_org_code = b.org_code
;

結果就是 人事部門 -> 考勤科
明白了嗎?

D. sql server自關聯

對表自身取笛卡爾積,然後去掉客戶名稱相同的

SELECTa.[證件號碼],a.[客戶名稱],b.[證件號碼]AS[證件號碼2],b.[客戶名稱]AS[客戶名稱2]
FROM[測試數據]ASa,[測試數據]ASb
WHEREa.[證件號碼]=b.[證件號碼]ANDa.[客戶名稱]!=b.[客戶名稱]

E. SQL連接 表自己的連接

sql 連接可分為以下幾類:

1、 一個表與自身進行連接,稱為自連接
例子:

有一個學生表,裡面有 學號 功課編號
學生成績三個欄位.用一個SQL查詢語句得出每門功課成績最好的前兩名

學號 功課編號 學生成績
1 1 99
2 1 98
3 1 100
4 2 88
5 2 87
6 2 88
7 3 99
8 3 88
9 3 100

解決方法
SELECT DISTINCT 學生表1.*
FROM 學生表 學生表1 INNER JOIN
學生表 學生表2 ON 學生表1.學號 IN
(SELECT TOP 2 學生表.學號
FROM 學生表
WHERE 學生表.功課編號 = 學生表1.功課編號
ORDER BY 學生成績 DESC)

查詢結果
學號 功課編號 學生成績
1 1 99
2 1 98
4 2 88
6 2 88
7 3 99
9 3 100

2、內聯接(典型的聯接運算,使用像 = 或 <> 之類的比較運算符)。包括相等聯接和自然聯接。
內聯接使用比較運算符根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。

3、外聯接。外聯接可以是左向外聯接、右向外聯接或完整外部聯接。
在 FROM子句中指定外聯接時,可以由下列幾組關鍵字中的一組指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外聯接的結果集包括 LEFT OUTER子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。

4、交叉聯接
交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。

FROM 子句中的表或視圖可通過內聯接或完整外部聯接按任意順序指定;但是,用左或右向外聯接指定表或視圖時,表或視圖的順序很重要。有關使用左或右向外聯接排列表的更多信息,請參見使用外聯接。

例子:
-------------------------------------------------
a表 id name b表 id job parent_id
1 張3 1 23 1
2 李四 2 34 2
3 王武 3 34 4
a.id同parent_id 存在關系
--------------------------------------------------
1) 內連接
select a.*,b.* from a inner join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2

2)左連接
select a.*,b.* from a left join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2
3 王武 null

3) 右連接
select a.*,b.* from a right join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2
null 3 34 4

4) 完全連接
select a.*,b.* from a full join b on a.id=b.parent_id
結果是
1 張3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 null

F. SQL 自關聯如何去重復

  1. 你沒有清楚你到底要問的是什麼,去重復只有兩種情景需要用到:

  • 非合並結果去重復記錄

  • 合並結果記錄去重復

2、非合並結果去重復:對單表查詢或者關聯表查詢的返回結果數據集,去除重復的記錄(所有的結果列值全部一致才算重復),這種使用DISTINCT關鍵字實現

SELECTDISTINCT欄位1,欄位2……
FROM數據表

3、合並結果記錄去重復:A UNION B,將B的結果集合並到A中(兩個結果集列數量和對應的列類型必須保持一致),並且如果B中的記錄在A中已經存在,那麼將拋棄不進行合並。注意:如果A本身就存在重復的記錄,還是會都出現,如果不想讓出現,需要用DISTINCT去重復

SELECT欄位1,欄位2……
FROM表A
UNION
SELECT欄位1,欄位2……
FROM表B

G. mysql怎麼讓2個表關聯起來

方法和操作步驟如下:

1、首先,創建一個測試表,如下圖所示,然後進入下一步。

H. sql合表禁止在同一張中間表中自關聯什麼意思

就是兩個表只能單獨查詢。
只用在查詢的時候用兩個表的查詢就可以了,一般表的id都是自動生成的,你在查詢的時候可以用一個中間表或者視圖來實現,將所需要的信息寫到裡面去,一般是不建議把第一個表的id直接寫到另外一個裡面去,那樣就有兩個查詢的條件了,也就是你的id和name,那樣是沒用的,不利於表之間的優化的,最好是在第一次存取的時候就將表的欄位生成,只進行行內的修改和整體的查詢輸出。
用updatex2setuid=(selectidfromx1wherex1.name=z2.name),來實現就好了,其實吧,我建議你把一個表裡面的name幹掉就留一個表的,然後用id做他們之間的主鍵來實現他們之間的關聯,這個在資料庫方面是通用的,現在資料庫都需要優化,尤其是在多表查詢的時候,所以你還是用心的研究一下,最好不要重復多個欄位在表之間的重復查詢,結果容易重復,所以我還是建議你把表優化,而不是考慮把值加進去,做到用什麼就從表之間查什麼就好了。