2016-04-06 64 views
2

我可能在這裏完全很厚。SQL查詢:獲取表A中列A =表B中列A的行

我有在原因代碼列表的表,「接入」到這些原因,通過列是否在具有1或0的限制。

ID | Category | Reason | Brand1 | Brand2 | Brand3 
1 | Test | That | 1 | 1 | 0 
2 | Test2 | This | 0 | 1 | 0 
3 | Test3 | Mine | 0 | 0 | 1 

用戶表

Username | Brand1 | Brand2 | Brand3 
    User1 | 1 | 1 | 0 

基本上User1應該只能看到他們在品牌列的用戶表中有1的原因,他們在原因表的品牌列中有1。

User1應該只能看到原因ID 1 & 2,因爲它們在用戶表中具有Brand1中的1和Brand2中的1。

我只希望從原因表中返回行,因此用戶表中的用戶在相應的「品牌」列中具有匹配1。

用戶1應該返回

ID | Category | Reason | Brand1 | Brand2 | Brand3 
1 | Test | That | 1 | 1 | 0 
2 | Test2 | This | 0 | 1 | 0 

我將如何在SQL得到這個,我試圖在WHERE語句或寫作,但它總是返回每一行。共有7個品牌專欄。

我想我忽略了一件簡單的事情,因爲這件事情太複雜了。

乾杯

+1

請根據您的樣品數據添加期望的結果。 –

+3

也發佈您的聲明。即使如果你簡單地比較每列是否相等(例如'WHERE A.Brand1 = B.Brand1 OR A.Brand2 = B.Brand2'),#3不應該出現 –

+0

SQL的外觀如何? –

回答

2

如果您發佈SQL然後我可以得到的東西更接近。

否則:

SELECT * 
FROM  Reasons AS R 
INNER JOIN UserTable AS U 
    ON  (U.Brand1 = 1 AND U.Brand1 = R.Brand1) 
     OR (U.Brand2 = 1 AND U.Brand2 = R.Brand2) 
     OR (U.Brand3 = 1 AND U.Brand3 = R.Brand3); 

這將讓只有當用戶有一個品牌的原因也有行。從技術上講,您可以將U.Brand# = R.Brand#更改爲R.Brand# = 1,但以後可能難以讓其他人閱讀。

SELECT * 
FROM  Reasons AS R 
INNER JOIN UserTable AS U 
    ON  (U.Brand1 = 1 AND R.Brand1 = 1) 
     OR (U.Brand2 = 1 AND R.Brand2 = 1) 
     OR (U.Brand3 = 1 AND R.Brand3 = 1); 

這可能會比第二個查詢更快,但在大多數情況下不足以注意。

2

如果我理解正確試試下面的腳本

SELECT t.ID , t.Category , t.Reason , t.Brand1 , t.Brand2 , t.Brand3 
FROM TableName t,UserTable U 
WHERE (t.Brand1 =U.Brand1 AND t.Brand1 = 1) OR 
     (t.Brand2 = U.Brand2 AND t.Brand2 = 1) OR 
     (t.Brand3 =U.Brand3 AND t.Brand3 = 1) 
+0

嗨jaydipJ,close但是它返回所有的行,0也存在,我只想要存在1的行。 – Lynchie

+0

@Lynchie Good Catch更新回答 –

1
SELECT 
    rt.* 
FROM ReasonTable AS rt 
INNER JOIN UserTable AS ut ON (rt.Id = 1 AND ut.Brand1 = 1) 
OR (rt.Id = 2 AND ut.Brand2 = 1) OR (rt.Id = 3 AND ut.Brand2 = 1) 
WHERE ut.UserId = @userId 
相關問題